Const类指针面向对象的bug

时间:2010-08-25 20:13:50

标签: c++ windows visual-studio-2008 oop const

我在下面有一个不能编译的简单示例。我得到关于const

的以下警告

错误讯息: 错误C2662:'Cfoo :: GetNum':无法将'this'指针从'const Cfoo'转换为'Cfoo&'转换失去限定符

class Cfoo 
{
    public:
        bool RunMe( const Cfoo * bar ) {
            int i = bar->GetNum() ; 
        }

        int GetNum() {
            return 7; 
        }
};   

int _tmain(int argc, _TCHAR* argv[])
{
    Cfoo a;

    Cfoo b;
    b.RunMe( &a); 

    return 0;
}

起初我认为这与GetNum没有返回const值有关。改变这似乎没有帮助。

我做错了什么?,建议,提示,示例,链接?

2 个答案:

答案 0 :(得分:9)

GetNum必须承诺它不会通过使其成为const成员函数来更改对象的值

class Cfoo 
{
    public:
        bool RunMe( const Cfoo * bar ) {
            int i = bar->GetNum() ; 
        }

        int GetNum() const { // !!!
            return 7; 
        }
};   

答案 1 :(得分:4)

litb的解决方案正是如此。

但是,我想详细说明编译器消息的实际含义以及如何解密它。

因此,这里是错误消息的更长解释以及如何在此上下文中理解它。我希望这里的所有大师都能纠正我的理解。

  

“错误C2662:'Cfoo :: GetNum':不能   将'this'指针从'const转换   Cfoo'到'Cfoo&'转换失败   限定符“

  1. 'bar'的类型为'Cfoo const *'.
  2. OP中的'GetNum'等成员函数被视为被声明为

      

    int Cfoo :: GetNum(Cfoo& dummyimpliedobjectparameter); //根据13.3.1/3 and /4

    隐含的对象参数

    根据13.3.1.1.1/2

    函数调用bar->GetNum()被视为(*bar).GetNum(*bar),其中(*bar)implied object argument

    现在,这意味着,类型'Cfoo const'的对象必须绑定到类型'Cfoo &'的引用,以将函数调用参数与函数参数匹配。根据{{​​1}},由于8.5.3/5'无法绑定到reference to non const,因此不允许这样做。

    正如litb所建议的那样,拯救的方法是将const作为Cfoo::GetNum成员函数。根据{{​​1}},通过此更改,成员函数const现在被视为

    13.3.1/3

    现在,成员函数'call'和'parameter'完全匹配,代码格式正确。

      

    @Steven:编译错误是否更有意义   现在?