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;
}
};
我有一个 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;
}
};