【问题标题】:How can I assign to an instance variable in C++ when a local variable has same name?当局部变量具有相同名称时,如何在 C++ 中分配给实例变量?
【发布时间】:2011-01-12 07:47:35
【问题描述】:

我有一个这样定义的类:

class MyClass 
{
    int x;
    public: 
        MyClass(int x); 
};

MyClass::MyClass(int x)
{ //Assign x here 
}

但是,我无法在构造函数中初始化x,因为它与实例变量具有相同的名称。有没有办法解决这个问题(除了更改参数的名称)?

【问题讨论】:

  • 您犯了一个错误。编译器理所当然地抱怨。修复你的代码。

标签: c++ instance-variables


【解决方案1】:

最好的选择是使用构造函数的初始化列表:

MyClass::MyClass(int x) : x( x ) { // Body }

但您也可以尝试这种方法:

MyClass::MyClass(int x) { this->x = x; }

【讨论】:

  • @dirkgently GCC 4.2 并没有抱怨这一点......阴影不好有什么理由吗?
  • @dirkgently -- 阴影可能并不理想,但它是有效的 C++。我们可以整天争论阴影,但他想知道的是 C++ 语义。
  • 说真的。你不能建议他使用更好的名字
【解决方案2】:

但是,我无法在构造函数中初始化 x,因为它与实例变量具有相同的名称。有没有办法解决这个问题(除了更改参数的名称)?

所以改参数名吧!

class MyClass  
{ 
    int x; 
    public:  
        MyClass(int xInitVal);  
}; 

MyClass::MyClass(int xInitVal)
    :x(xInitVal)
{ // Don't assign x here.  
} 

通过使参数名称与本地参数名称相同,您只会使代码难以阅读。

不要这样做。您遇到的几乎所有样式指南都会告诉您不要将参数与成员同名。

【讨论】:

    【解决方案3】:

    顺便说一句-您确实应该为您的成员变量制定一个不冲突的命名约定。这通常是 c++ 房屋的编码规则 1 或 2。然后当你看到 m_foo = bar 你就知道发生了什么

    我们使用

     int m_thingy;
    

    我也见过

     int _thingy;
     int thingy_
    

    如果您知道这一点并且不能或不会这样做,请提前道歉

    【讨论】:

    【解决方案4】:

    this->x = x;

    【讨论】:

    • 说真的。你不能建议他使用更好的名字。对于不是 int 的更复杂的类型,无论如何这都是错误的答案。
    • 是的,你是对的。更好的名称,无需额外的初始化等。感谢您指出这一点。
    【解决方案5】:

    您可以使用this 显式引用当前对象:

    this->x = x;
    

    【讨论】:

    • 说真的。你不能建议他使用更好的名字。对于不是 int 的更复杂的类型,无论如何这都是错误的答案。
    • 为什么代表较高的人简洁地建议this->x = x;,而代表较低的人建议重命名参数?高级技术知识与常识? :)
    【解决方案6】:

    我强烈建议您只更改变量名称。使用重复的标识符是一场没有原因的斗争。

    在我的代码中,我给所有函数参数加上前缀“in”(“inValue”)。我给所有私有成员变量加上前缀“m”(“mValue”)。

    【讨论】:

      【解决方案7】:

      请改用this->x

      【讨论】:

        【解决方案8】:

        使用 this 指针

        MyClass::MyClass(int x)
        {
            this->x = x;
        }
        

        当然,一开始就没有这样的冲突名称会是一个更好的解决方案。

        【讨论】:

        • 我猜这结合了两全其美。不需要this->x = x,这是一种糟糕的形式。此外,正如 Scott Meyers 在他的 Effective C++ 系列中所说,“在构造函数中优先使用初始化列表。”
        【解决方案9】:

        this->x = x 不起作用?这就是我们所做的(或使用了不同的参数名称)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-24
          • 1970-01-01
          • 1970-01-01
          • 2017-10-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多