6

次のようなクラスがあるとします

class Egg
{
    static Egg e;
    int i;
    Egg(int ii):i(ii) {}
    Egg(const Egg &);    //Prevents copy-constructor to be called
  public:
    static Egg* instance() {return &e}
};

Egg Egg::e(47);

このコードは、オブジェクトを作成できないことを保証しますが、静的オブジェクトのみを使用できます。しかし、クラス内で同じクラスの静的オブジェクトを宣言するにはどうすればよいでしょうか。

また、e は静的オブジェクトであり、静的オブジェクトは静的メンバー関数のみを呼び出すことができるため、ここで静的オブジェクト e に対してコンストラクターを呼び出す方法があり、そのコンストラクターもプライベートであるため、もう 1 つ重要です。

4

2 に答える 2

7

しかし、クラス内で同じクラスの静的オブジェクトをどのように宣言できますか。

staticメンバー変数は、クラスの各オブジェクト内に格納されません。したがって、クラス内で、またはクラスを定義した後に名前空間レベルのオブジェクトとしてメンバー変数を宣言する場合、アクセス(および)とアクセス(および)とメンバーへのstaticアクセスのみが異なります。Class::varvarprotectedprivate

またe、静的オブジェクトであるため、静的オブジェクトは静的メンバー関数のみを呼び出すことができます。

static関数とstaticオブジェクトを混ぜていると思います。関数内では、static関数のみを呼び出すことができますstatic(オブジェクトで関数を呼び出す場合を除く)。

では、静的オブジェクトに対してコンストラクターをここで呼び出すにはどうすればよいでしょうか。e

他のすべてのオブジェクトと同様に、オブジェクトに対してもコンストラクターを呼び出す必要がstaticあります。

また、そのコンストラクターはプライベートです

アクセス制御は、C++のクラスレベルでチェックされます。したがって、staticオブジェクトはクラス内にあるため、privateメンバーにアクセスできます。

他のいくつかの言語とは異なり、C ++では以下が有効です。プライベートメンバーへのアクセスはクラス内からであるためです。別のオブジェクト(otherこの場合)であっても、次のようになります。

 class Test {
 private:
      int i;
 public:
      Test(const Test &other)
      : i(other.i)
      {}
 };
于 2012-06-03T22:35:25.477 に答える
2

しかし、クラス内で同じクラスの静的オブジェクトをどのように宣言できますか。

通常は前方参照が必要ですが、Egg eは静的であるため、実際にはクラス定義の外部で定義されています。eが静的でない場合は、エラーが発生します(「フィールドEgg eのタイプが不完全です」など)。

また、eは静的オブジェクトであり、静的オブジェクトは静的メンバー関数のみを呼び出すことができるため、静的オブジェクトeに対してコンストラクターをここで呼び出すにはどうすればよいでしょうか。

これは完全に真実ではありません。クラス内の静的メンバー関数は、静的メンバーデータにのみアクセスできます。static Egg eはEggのインスタンスであるため、通常のEggがアクセスできるすべてのメンバーとデータにアクセスできます。

また、そのコンストラクターはプライベートです。

クラス内から任意のプライベートメンバーを使用できます。static Egg eはEggのメンバーとして宣言されているため、プライベートコンストラクターを使用できます。eの定義は静的であるためクラスですが、それでもクラスメンバーです。

そして最後に、ここでセミコロンを省略したため、コードはコンパイルされません。

static Egg* instance() {return &e;}
于 2012-06-03T23:47:53.967 に答える