0

ここで最初の回答で説明した方法でシングルトンを実装しています。getInstance() メソッドは参照を返しますが、新しいインスタンスを作成し、それを作成して返す前に既に存在するかどうかを確認する方法についてはよくわかりません。

class Song {

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

public:
    static Song &getInstance();
}

では、私のgetInstance();実装はどのように見えるべきでしょうか? 曲のメンバーオブジェクトが既に存在する場合はそれを返し、それ以外の場合はそれを作成して返したいと思います。追加したリンクに実装があることは知っていますが、それが私が望むことを行うかどうかはわかりませんし、よく理解していません。

=また、これらの 2 行の目的と、演算子が上書きされる理由を誰か説明してもらえますか?

    Song(Song const&); // don't implement
    void operator = (Song const&); //don't implement
4

3 に答える 3

1

実装は、あなたが引用した答えにあります:

static S& getInstance()
{
    static S    instance; // Guaranteed to be destroyed.
                          // Instantiated on first use.
    return instance;
}

インスタンスは静的であるため、getInstance()関数の最初の呼び出しでインスタンス化されます。

詳細については、この関連する SO の質問を参照してください。

2番目の質問のメモ。1 つ目はコピー コンストラクターです。

Song(Song const&);

オブジェクトを初期化して別のオブジェクトの値を取得する場合に必要です。

Song a;
Song b = a; // calls copy constructor

2 番目は代入演算子です。

void operator=(const Song&);

既存のインスタンスに値を割り当てるために必要:

Song a;
Song b;
b = a; // calls assignment operator.

代入演算子の標準の戻り値は参照であることに注意してください。

Song& operator=(const Song&);
于 2012-07-26T13:57:51.967 に答える
1

では、getInstance(); はどうすればよいでしょうか。実装はどのように見えますか?曲のメンバーオブジェクトが既に存在する場合はそれを返し、それ以外の場合はそれを作成して返したいと思います。

それはまさにあなたがリンクするコードが行うことです。その答えを引用するには:

static S& getInstance()
{
    static S    instance; // Guaranteed to be destroyed.
                          // Instantiated on first use.
    return instance;
}

コメントにあるように、最初の使用時にインスタンス化されます。これが、関数スコープでの静的変数のしくみです。

Singleton アンチパターンを実装しようとするこの特定の試みに関連する致命的な問題は、別の静的オブジェクトのデストラクタなどから、破棄された後にアクセスできることです。

また、これらの 2 行の目的と = 演算子が上書きされる理由を誰かが説明できますか?

これらは、オブジェクトのコピーを防ぐためのものです。コピーは、コピー コンストラクター (新しいオブジェクトの作成) またはコピー代入演算子 (既存のオブジェクトの上書き) のいずれかで実行できます。これらが非公開として宣言され、実装されていない場合、インスタンスはコピーできません。C++11 では、これを削除することでより明確にすることができます。

Song(Song const&) = delete;
void operator = (Song const&) = delete;
于 2012-07-26T13:59:47.217 に答える
0

2 番目の質問に答えるために、これらの 2 行では、コピー コンストラクターと代入演算子をプライベートとして宣言しているため、それらを呼び出すことはできません。これらの 2 行がないと、コンパイラはこれらのデフォルトの実装を生成し、クライアントはコピーを作成して、Singletonパターンの目的を無効にする可能性があります。

于 2012-07-26T14:00:22.203 に答える