代码之家  ›  专栏  ›  技术社区  ›  Steven Smethurst

类面向对象bug中的常量指针

  •  1
  • Steven Smethurst  · 技术社区  · 14 年前

    下面有一个不编译的简单示例。我得到以下关于康斯特的警告

    错误信息: 错误C2662:“cfo::getnum”:无法将“this”指针从“const cfo”转换为“cfo&”转换将丢失限定符

    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没有返回常量值有关。改变这一点似乎没有帮助。

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

    2 回复  |  直到 14 年前
        1
  •  9
  •   Johannes Schaub - litb    14 年前

    GetNum 必须保证它不会通过使对象成为常量成员函数而更改其值

    class Cfoo 
    {
        public:
            bool RunMe( const Cfoo * bar ) {
                int i = bar->GetNum() ; 
            }
    
            int GetNum() const { // !!!
                return 7; 
            }
    };   
    
        2
  •  4
  •   Chubsdad    14 年前

    Litb的解决方案就在上面。

    但是,我想尽我所能来详细说明编译器消息的实际含义以及如何破译它。

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

    “错误C2662:'cfoo::getnum':无法 将“this”指针从“const”转换 cfoo'到'cfoo&'转换丢失 限定词“

    1. 类型 'bar' 'Cfoo const *'.

    成员函数,如 'GetNum' 在OP是 考虑过的 宣布为

    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 &' ,以将函数调用参数与函数参数匹配。按照 8.5.3/5' ,这不允许作为 reference to non const 无法绑定到 const .

    因此,正如利特所建议的,纾困的方法是 Cfoo::GetNum 作为一个 康斯特 成员函数。按照 13.3.1/3 ,通过此更改,成员函数 Cfoo:盖特纳 现在被认为是

    int Cfoo::GetNum(Cfoo const &dummyimpliedobjectparameter); // note the const

    现在,成员函数“call”和“parameter”完全匹配,代码的格式也很好。

    @史蒂文:编译错误更有意义吗? 现在?

    推荐文章