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

Posted

技术标签:

【中文标题】防止 const 类函数在引用成员上调用非 const 类函数【英文标题】:Prevent const class function from calling non-const class function on reference member 【发布时间】:2014-05-12 23:39:25 【问题描述】:

请原谅我的标题相当晦涩,但它确实说明了一切。这就是我的意思

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() 不是const 应该可以继续调用。

我正在使用 Visual C++ 2013。

上面的代码将演示我的程序中的一个错误。 (在我的场景中,A 类将卸载调用代码的对象/this 指针。)由于 const 正确性的目的是防止此类错误,我只是想知道是否有办法在编译时检查这一点.

在我正在编写的应用程序中,调用该函数似乎一点也不危险。当从 DoEvenMore() 调用它时,结果将是相同的,除了 B 的销毁被推迟到函数运行完成。

【问题讨论】:

【参考方案1】:

不要使用_a 数据成员直接创建具有const 和非const 重载的访问器函数。这将导致在从Bconst 成员函数中调用时选择const 重载,从而阻止您调用A 的非const 函数。

A const& GetA() const  return _a; 
A& GetA()  return _a; 


void DoSomethingElse() const

    GetA().DoSomething(); // error

【讨论】:

谢谢,这就是我想要的。没有办法让它隐含,对吧? (省略通话。) @Aidiakapi 如果您的意思是直接访问_a,那么不,没有。由于_a 本身不是const,您可以使用它调用非const 成员函数。【参考方案2】:

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

class B 
private:
    inline A& a()  return _a; 
    inline const A& a() const  return _a; 
public:
    // ...
;

【讨论】:

以上是关于防止 const 类函数在引用成员上调用非 const 类函数的主要内容,如果未能解决你的问题,请参考以下文章

c++学习总结------类结构学习

C/C++中各个位置的const关键字

C/C++中各个位置的const关键字

C++类中成员函数声明后面接 const

测试页面