【问题标题】:Assign value to private static variable in a class [duplicate]为类中的私有静态变量赋值[重复]
【发布时间】:2016-09-29 22:21:11
【问题描述】:

我有一个文件 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::s 的引用

【问题讨论】:

  • 您应该始终将收到的错误添加到堆栈溢出帖子中。这将类似于 s 未定义。
  • 已编辑:我已经把错误信息放了。

标签: c++


【解决方案1】:

当你定义时:

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

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

void A::modify_string() {

通知编译器您正在为类A 定义成员函数modify_string


你还需要一个; 在你的类定义之后。


最后,变量s 是静态的,因此需要在某个地方单独定义它,以便链接器可以找到对它的引用。所以添加:

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

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


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

【讨论】:

  • 是的,我打算写 A::,但是我现在已经在我的问题中纠正了它。
  • @SeasonalShot 我为你添加了其余的错误。
  • 我想我需要了解静态声明与它的定义。即“声明静态成员很好,但没有在任何地方定义它们。”就是所说的,除了我上面提到的链接中没有明确定义之外,因为接受的答案上有一个链接已经死了。
  • @SeasonalShot 答案中的链接不重要,没有它,答案是可靠的。
  • 在挖掘了死链接的缓存版本后,这里是dietmar-kuehl.de/mirror/c++-faq/ctors.html#faq-10.12。这解释了它的详细程度,这是作者最初打算阅读的基本层面的理解。链接中的答案提供了代码 sn-ps,该代码有效但尚未完全理解。恕我直言
【解决方案2】:

您需要在一个编译单元中为 s 预留存储空间。

通过写作来做到这一点

std::string A::s;

在一个源文件中。

【讨论】:

  • 是的,我打算写 A::,但是我现在已经在我的问题中纠正了它
  • 知道了,改写答案。
  • 谢谢。我想我会把它写在 A.cpp 构造函数中。我认为它所做的只是提供定义。
  • 不,我不能在构造函数中写它,我需要在函数之外写它。
【解决方案3】:

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

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

【讨论】:

  • 是的,我打算写 A::,我现在已经在我的问题中纠正了它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多