2016-05-31 99 views
0

我有一个文件A.hpp这样:值分配给私有静态变量的类

class A 
{ 
private: 
    static std::string s; 
public: 
    void modify_string(); 
}; 

我A.cpp实现这一个文件,例如:

#include "A.hpp" 

void A::modify_string() 
{ 
s = "something"; // Error here. 
} 

我主类:

int main() 
{ 
A a; 
a.modify_string(); 
} 

我知道静态变量是由所有类实例共享的。我也通过这个SO帖子说明了如何访问静态成员。 Public static member of class。你能不能让我知道我的概念缺失的地方?

编辑: 我收到此错误: 错误:未定义参考A ::小号

+1

你应该总是把你收到的错误添加到堆栈溢出文章中。这将是's'是未定义的。 –

+0

编辑:我已经把错误信息。 – SeasonalShot

回答

3

当你定义:

void modify_string() { 
    s = "something"; // Error here. 
} 

您正在创建一个新的功能,而不是定义成员函数Amodify_string。你需要做的:

void A::modify_string() { 

要通知您要为A类的成员函数modify_string编译器。


您的类定义后还需要;


最后,可变s是静态的,所以它需要seperatly某处定义因此链接可以找到它的参考。因此,请添加:

std::string A::s = "default"; 

这在您为问题提供的链接中已有明确说明。


这里是一个工作示例:http://ideone.com/iQ6Kux

+0

是的,我打算写A ::,但是我现在在我的问题中纠正了它。 – SeasonalShot

+0

@SeasonalShot我为你补充了其余的错误。 –

+0

我想我需要知道关于静态声明与它的定义。即“声明静态成员很好,但没有在任何地方定义它们。”是什么说,除了它没有明确定义在我上面提到的链接,因为接受的答案有一个链接死了。 – SeasonalShot

1

你需要在一个编辑单元中保留存储为秒。

做到这一点写

std::string A::s; 

在一个源文件。

+0

是的,我打算写A ::,但是我已经纠正它在我的问题 – SeasonalShot

+0

得到它,答案重写。 – Bathsheba

+0

谢谢。我想我会写在A.cpp的构造函数中。我认为它所做的只是提供了定义。 – SeasonalShot

0

您在A.cpp中定义void modify_string() {...}没有定义该类的成员函数,而是定义了一个具有相同名称的独立全局函数。你的意思可能是

void A::modify_string() 
{ 
    s = "something"; 
} 
+0

是的,我打算写A ::,我已经在我的问题中纠正了它 – SeasonalShot