Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于“使用”的问题;这";C++;_C++ - Fatal编程技术网

C++ 关于“使用”的问题;这";C++;

C++ 关于“使用”的问题;这";C++;,c++,C++,这是我的密码。我尝试用通过构造函数“rate”的本地成员设置私有成员“rate”。但我可以在C#中这样使用它 错误是: 表达式必须具有类类型当您引用此时,您正在访问指向该对象的指针。您要做的是: class Monitor { private: int rate; Monitor(int rate) { this.rate = rate; } } 这个->速率=速率。指针使用C++中的->运算符。 Monitor(int rate) {

这是我的密码。我尝试用通过构造函数“rate”的本地成员设置私有成员“rate”。但我可以在C#中这样使用它

错误是:


表达式必须具有类类型

当您引用此时,您正在访问指向该对象的指针。您要做的是:

class Monitor
{
private:
    int rate;

    Monitor(int rate)
    {
        this.rate = rate;
    }
}

这个->速率=速率。指针使用C++中的->运算符。
Monitor(int rate)
{
    this->rate = rate;
}
这需要像指针一样对待。因此->

因为这是指向self的指针,所以必须使用它。这可以解决您的问题:

class Monitor
{
private:
    int rate;

    Monitor(int rate)
    {
        this->rate = rate;
    }
}

关键字表示指向当前对象的指针。 你必须写:

class Monitor
{
private:
    int rate;

    Monitor(int rate)
    {
        this->rate = rate; // this is a pointer
    }
};

如果您有类的实例,则使用点表示法

正如其他人所说,这是一个指针,但使用基本初始值设定项列表更好、更正确:

this->rate = rate;
这样,
Monitor::rate
将初始化为正确的值,而不是先初始化然后分配默认值。对于更一般的成员对象,这实际上可能是初始化它们的唯一合法方法

class Monitor
{
   int rate;
public:
   Monitor(int rate) : rate(rate) { }
};
或者更好:

Monitor(int r)
    {
        rate = r;
    }

虽然它是完全合法的C++代码,但不应该为类的参数和成员使用相同的名称。更好的实施将是:

Monitor(int r): rate(r)
    {}

这是一个指针<代码>这->
是您想要的,所以我必须使用Monitor::rate=rate?还有其他方法吗?@Anycorn:这应该是一个答案,而不是一个注释。使用指针与使用Monitor::rate是相同的->还是不同的概念?@user:它们不同,只有当
rate
static
成员变量时,才可以使用
Monitor::rate
。这是一个更优雅的解决方案。谢谢,我不知道我们有这样的方法。但是,我不明白为什么我们不能用那个监视器(int-rate):rate(rate)@user810576:您仍然必须定义构造函数的主体,即使它没有做任何事情,因此我们的主体只是
{}
。基初始值设定项列表是定义的一部分,而不是声明的一部分。请注意,某些编译器会警告您隐藏parameter@VJo:谢谢。事实上,我通常会写
Monitor(int-r):rate(r){}
,或者如果成员是私人的和装饰性的,比如
Monitor(int-rate):mu-rate(rate){}
等等。这是一个很好的调用,特别是如果你想重用参数:
Foo(Bar a,Car b):mu a(a),m_b(mu a){
。不是否决票,只是一个IMHO-yech。大多数编码标准都规定不要为成员使用InitialCaps名称。InitialCaps通常用于类。Re the alternative
m_nRate
:这也是我个人的偏好,但我真的鄙视匈牙利符号。嗯,不完全是个人喜好;很多很多人真的很鄙视匈牙利符号。那么,你会用什么呢?”比率“,”nRate“,”u rate“?我只是在征求意见。对于数据成员,“rate”——或者更具描述性的词,比如“update\u rate”。或者可能是“更新间隔”,因为很多人在表示“间隔”(单位是时间/某物)时误用了术语“速率”(单位是某物/时间)。对于构造函数或setter,取决于项目编码标准。这通常是我无法控制的。参数名称要么与数据成员的名称完全相同,要么类似于“rate_in”。这个参数是一个伪变量,所以对我来说,赋予它相对于数据成员的优先级就是本末倒置
    class Monitor
    {
    private:    
         int Rate;     // Or m_nRate
    public:
          Monitor(int rate /* OR nRate */) : Rate(rate) /* m_nRate(nRate);*/

          // OR
          Monitor(int rate /* OR nRate */)
          {
              Rate = rate; // this->Rate = rate;     // this->m_nRate = nRate;
          }
      };