调用Singleton getInstance()时出现未定义的符号错误

时间:2012-07-26 15:04:32

标签: c++ xcode static singleton

我不知道为什么会这样,我按照发布的here.

示例
class Song {

private:
    // singletong
    Song();
    Song(Song const&); // don't implement
    void operator = (Song const&); //don't implement

public:
    // Singleton method
    static Song &getInstance(){
        static Song song;
        return song;
    }

};

如果我不打电话给班级,那就没问题了。我一打电话给Song课程:

Song::getInstance();
// also tried: Song &song = Song::getInstance();

Xcode不再需要构建项目了。我收到这个错误: enter image description here

为什么会发生这种情况?

3 个答案:

答案 0 :(得分:8)

您没有实现自getInstance()函数中实例化对象以来必须存在的构造函数:

static Song song;

实现内联(不受欢迎):

private:
    // singletong
    Song() {
        // Your implementation goes here
    }

或者在编译单元(例如Sound.cpp)(首选)中实现它:

Song::Song(){
    // Your implementation goes here
}

答案 1 :(得分:1)

无论

  • 您没有实现默认构造函数 - 只需将Song();替换为Song() {},看看是否是原因。
  • 您正在通过调用Song s = Song::getInstance()而不是Song& s = Song::getInstance()来创建副本。

答案 2 :(得分:1)

您没有为默认构造函数提供实现。这就是为什么你得到一个未定义的引用。

这是链接错误,而不是编译器错误。这意味着您的代码实际上已正确编译。编译之后,链接器将获取编译的目标代码并将其“链接”在一起以形成可执行文件。如果你的所有函数都没有像你声明的那样存在,那么链接器就会生气(在动态链接的情况下这不是严格的,但这是另一个问题)。

但是,许多编译器不会浪费时间尝试链接从未在代码中调用过的函数。

在你的情况下,当你不调用函数时,你不会得到这个错误,因为你的getInstance()从不试图构造一个对象,因为它没有被调用。