阻止const类函数在引用成员上调用非const类函数

时间:2014-05-12 23:39:26

标签: c++ visual-c++ c++11 const-correctness

请原谅我这个相当模糊的标题,但它确实有点说明了一切。这就是我的意思

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()的销毁被推迟到函数运行完毕。

2 个答案:

答案 0 :(得分:9)

不使用_a数据成员直接创建具有const和非const重载的访问器函数。从const的{​​{1}}成员函数调用时,这会导致const重载被选中,从而阻止您调用{{1}的非B函数}}

const

答案 1 :(得分:5)

“constness”的规则使对象本身不可变,但不影响指向/引用对象的常量。如果要在使用const方法时仅访问<{1}}引用 ,则需要在constness上创建一个重载方法,该方法返回引用或const引用。

const