我不知道为什么会这样,我按照发布的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不再需要构建项目了。我收到这个错误:
为什么会发生这种情况?
答案 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()从不试图构造一个对象,因为它没有被调用。