请原谅我这个相当模糊的标题,但它确实有点说明了一切。这就是我的意思
class A
{
void DoSomething(); // non-const
}
Class B
{
public:
B(A& a) : _a(a) { }
// const function
void DoSomethingElse() const
{
// Is there a way to disallow this?
_a.DoSomething();
}
void DoEvenMore()
{
// Should be OK
_a.DoSomething();
}
private:
// Can't make it const A& because it needs
// be non-const for non-const functions
A& _a; // A reference
}
那么我是否有办法阻止B::DoSomethingElse()
拨打A::DoSomething()
?
但是,不B::DoEventMore()
的{{1}}应该可以继续通话。
我使用的是Visual C ++ 2013。
上面的代码会在我的程序中演示 bug 。 (在我的场景中,类A将卸载调用代码的对象/ const
指针。)由于const-correctness的意思是防止这些错误,我只是想知道是否有'在编译时检查这个的方法。
在申请表中我写这个功能根本不会打电话。从this
调用它时,结果将是相同的,除了DoEvenMore()
的销毁被推迟到函数运行完毕。
答案 0 :(得分:9)
不使用_a
数据成员直接创建具有const
和非const
重载的访问器函数。从const
的{{1}}成员函数调用时,这会导致const
重载被选中,从而阻止您调用{{1}的非B
函数}}
const
答案 1 :(得分:5)
“constness”的规则使对象本身不可变,但不影响指向/引用对象的常量。如果要在使用const
方法时仅访问<{1}}引用 ,则需要在constness上创建一个重载方法,该方法返回引用或const引用。
const