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 に答える