2

我正在尝试初始化一个静态类成员并且没有运气。这是一个测试:

文件测试.h

#include <string>

class Test {

public:
    static void init(char*);

private:
    static std::string  *sp;

};

文件测试.cpp

#include "Test.h"

// Initialize the class
void
Test::init(char *foo) {
    Test::sp = new std::string(foo);
}

int main(int argc, char** argv) {
    Test::init(argv[1]);  // call the class initializer
}

链接器失败并显示:

Undefined symbols for architecture x86_64:
  "Test::sp", referenced from:
      Test::init(char*) in Test-OK13Ld.o
ld: symbol(s) not found for architecture x86_64

在现实世界中,init() 会做一些实际的工作来设置静态成员。有人可以指出错误吗?

4

2 回答 2

1

正如错误消息所说,static std::string *sp;必须在某处定义,因为它与class Test.

在全局范围内将其添加到 Test.cpp 将解决此问题:

std::string *Test::sp = NULL;
于 2013-07-15T04:06:46.770 回答
1

这是 C++ 的一个令人尴尬的“特性”:您需要手动操作以确保链接器可以生成符号。您需要选择一些 cpp文件,并确保不会在任何其他文件中出现相同符号的此类牵手(否则链接器在遇到重复符号时将失败)。因此,您必须在文件中为您的类再次声明静态成员变量,cpp如下所示:

std::string * Test::sp; // or sp = NULL;
于 2013-07-15T04:06:56.610 回答