2011-06-06 122 views
0
class a{ 
public: 
    int b; 
    static int c; 
    virtual void mod() const 
    { 
     c=4; 
    } 

}; 



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

    return 0; 
} 

看这...使用Visual Studio C++编译器2010编译之后,我得到...C++中的Const过程,Visual Studio C++ 2010中的奇怪错误?

cpplearningconsole.obj:错误LNK2001 :解析外部符号 “市民:静态INT一:: c“(?c @ a @@ 2HA)

我想这是一个编译器错误。 对我来说,真正的问题是。应该mod能够修改c变量,如果它是常量?

谢谢。

+3

这不是一个编译器错误...你已经声明了静态成员'c',但没有在任何地方定义它。 – forsvarir 2011-06-06 11:46:35

+0

'mod'可以是'const'并且改变'c'的值,因为'c'不是实例的成员(因为它是静态的)'mod'被调用,所以实例不会改变。 – forsvarir 2011-06-06 11:53:27

+0

mod是在类中定义的,还有b,为什么不是c?这里的逻辑在哪里? – Aftershock 2011-06-06 11:57:33

回答

8

你刚才宣布在类定义静态变量,你需要定义它在做int a::c = 0;

+1

事实上,这个错误与成员函数是'const'没有任何关系,而且它当然不是编译器错误。 – Jesper 2011-06-06 11:55:45

1

您应该为您的变量成员添加正确的定义,在您只有声明的类中。在你的CPP或只是类的声明(在它之外)之后添加:

int a::c = 0;

3

此:

cpplearningconsole.obj:错误LNK2001:无法解析的外部符号“公用:静态INT一: :c“(?c @ a @@ 2HA)

不是编译器消息,它是链接器消息。你明白了,因为虽然你已经声明了成员c,但你还没有定义它。静态成员只需要在一个源文件中定义,以便创建它们。喜欢的东西:

int a::c = 0; 

关于你的第二个问题,声明功能const,指出它不会修改它被称为上的对象。你不修改对象,它修改静态成员。这就是为什么你没有得到编译器错误。

0

为了回答您的其他问题:

c是你的类的公共静态成员。 任何人都可以改变它的值,那么为什么不可以mod()