3

シングルトンである別のクラスへの静的ポインターを持つクラスがあります。私が得ているように見える問題は、そのクラスのコンストラクター内からポインターを設定できないことです。これが私の現在のコードです:

class B;

class A
{
  public:
    A();
    ~A();
};


class B
{
  public:

    B();
    ~B();

    static A* a;
};

A::A() {
  A* B::a = this;
}

今、私が得ているように見える問題は、「現在のスコープ」で B::a を定義できないことです。さらに、「this」ポインターは「非静的メンバー関数」でのみ使用できます。

問題は、別のクラス関数内で静的クラス変数を定義することに関係していると思いますが、よくわかりません。

4

2 に答える 2

3

まず、静的クラス メンバーを宣言するだけでなく、定義する必要があります。static A* a;クラス B の本体の は単なる宣言であり、a を定義する必要があります。すべてのクラス メンバーには単一の定義が必要であることに注意してください。そのため、通常.cpp、クラスの適切なファイルで静的メンバーを定義します。明らかに、これはクラス本体の外で発生します。関数のスコープ内で静的メンバーを定義することもできません。

したがって、次のように、 a の定義をコンストラクターのスコープの外に移動します。

class B
{
public:

    B();
    ~B();

    static A* a;};

A* B::a = 0; // Good idea to set a default value for the pointer

ただし、aタイプ A のオブジェクトが少なくとも 1 つ作成されるまで、 の値には 0 が含まれることに注意してください。

于 2012-10-29T03:45:05.150 に答える
0

クラス宣言の外ですべての静的メンバーを定義する必要があります。

class B;
class A
{
public:
    A();
    ~A();
};


class B
{
public:

    B();
    ~B();

    static A* a;
};

A* B::a; // HERE

A::A()
{
    B::a = this; // and there was an error here too
}

他の ctors/dtors を定義することを忘れないでください。

于 2012-10-29T03:40:46.187 に答える