1

我不知道为什么会这样,我按照此处发布的示例进行操作。

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 不想再构建项目了。我收到此错误: 在此处输入图像描述

任何想法为什么会发生这种情况?

4

3 回答 3

8

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

static Song song;

内联实现它(不推荐):

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

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

Song::Song(){
    // Your implementation goes here
}
于 2012-07-26T15:05:57.803 回答
1

任何一个

  • 您没有实现默认构造函数 - 只需替换Song();Song() {}查看这是否是原因。
  • Song s = Song::getInstance()您正在通过调用而不是创建副本Song& s = Song::getInstance()
于 2012-07-26T15:06:38.127 回答
1

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

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

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

在您的情况下,当您不调用该函数时,您不会收到此错误,因为您的 getInstance() 永远不会尝试构造一个对象,因为它没有被调用。

于 2012-07-26T15:06:40.373 回答