C++ const 参数指令阻止 class 的函数使用

C++ const parameter directive blocks function use of class

我有一个 C++ class 用作函数参数,这让我有些伤心。当 class 参数指定为 const.

时,我似乎无法从该参数调用函数

样本class:

class FooBar
{
  private:
    bool barFoo; // I want this modifiable only through functions

  public:
    const bool& getBarFoo() // this function needs to be used to retrieve it
    { 
      return barFoo;
    }

    void setBarFoo(bool newVal) // this is the set function. It validates if the set is possible
    {
      // check if modification is possible. 
      barFoo = newVal
    }
}

我尝试在类似于此的函数中使用此 class:

void DoShizzle(const FooBar& yesOrNo)
{
  if(yesOrNo.getBarFoo()) // here the code shows an error*
  {
    // do shizzle
  }
  else
  {
    // do other shizzle
  }
}

* 消息显示 'the object has type qualifiers that are not compatible with the member function "FooBar::getBarFoo" object type is: const FooBar'。

如果我从 DoShizzle 函数的 FooBar 参数中删除 'const' 指令,错误就会消失。但是我读到您应该尝试告诉开发人员和编译器您在做什么。我想将变量 barFoo 保持私有,以便只能使用 setBarFoo 函数对其进行修改,以防止在未验证是否可以的情况下对其进行修改是。但我也想传达函数 DoShizzle 不会编辑 FooBar class.

什么可以很好地解决我的问题?接受我不能在这里使用 const 的事实吗?还是我错过了解决我问题的另一种方法?我是 C++ 的新手,天生就是 C# 开发人员,所以我知道我可能不得不忘记一些实践

成员函数的

const 限定符不一定与其 return 类型的 const 限定符相同。实际上它们通常是不相关的(仅当您 return 对成员的引用时,从 const 方法只能获得 const 引用)。你的方法:

const bool& getBarFoo() // this function needs to be used to retrieve it
{ 
  return barFoo;
}

是一个non-const方法,return是一个const bool&(对bool的常量引用)。

如果您希望能够在 const FooBar 上调用方法,您必须将方法声明为 const:

const bool& getBarFoo() const // <--------
{ 
  return barFoo;
}

问题是目前成员函数getBarFoo不能用于const类型FooBar的对象。

为了解决这个问题你应该通过添加[=12=使成员函数getBarFoo成为常量成员函数 ] 如下图:

class FooBar
{
  private:
    bool barFoo; 

  public:
    ////////////////////////VVVVV
    const bool& getBarFoo() const //added const here
    { 
      return barFoo;
    }

    void setBarFoo(bool newVal) 
    {
       
      barFoo = newVal;
    }
};