0

すべてが 1 つのファイルにまとめられたプログラムを作成し、メソッドはヘッダーで前方宣言されました。プログラムは、最初は 1 つのファイルにあるときに完全に機能しました。しかし、プログラムを分離すると、ヘッダー ファイルで宣言されたクラスの 1 つのデストラクタがランダムに発生し続けました。

特定のクラスのオブジェクトの数をカウントするために、ヘッダーに静的変数があります。オブジェクトを構築するたびに、この変数をインクリメントします。次に、デストラクタでその変数から 1 を減算し、それが 0 (最後のオブジェクトであることを意味する) かどうかを確認し、何かを行います。値が時々ずれているようですが、理由はわかりません。アプリケーションにランダムな呼び出しがありますが、それが上記の説明に影響する理由がわかりません。ありがとうございます。どんな助けや洞察も大歓迎です!

[更新]:ヘッダーに実装されているデストラクタを含む基本クラスがあります。次に、コンストラクタで静的変数をインクリメントする2つの派生クラスがあります..どうすればよいですか?

私がやろうとしていることは次のとおりです:私のヘッダーにはこれがあります:

class A {
public:
    virtual ~A() {
        count --;
        if (count == 0) { /* this is the last one, do something */ }
    }

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

次に、クラスBIには

B::B() { 
    count++;
}

誤解を招くカウントを取得しないように、どこでカウントを定義できますか? ありがとう。

4

4 に答える 4

6

カウントをインクリメントするには、A (それらすべて) でコンストラクターを定義する必要があります。

これらを定義しない限り、コンパイラは次の 4 つのメソッドを自動的に生成することに注意してください。

  • デフォルトのコンストラクター (他のコンストラクターが定義されていない場合)
  • デフォルトのデストラクタ
  • コンストラクターのコピー
  • 代入演算子

次のコードは、コンパイラの既定値をオーバーライドして、正確なカウントを取得できるようにします。

 class A
 {
    static int count;

    public:
        A()   // Default constructor.
        {
            ++count;
        }
        A(A const& copy)  // Copy constructor/
        {                 // Note If you do not define it the compiler
            ++count;      // will automatically do it for you
        }
        virtual ~A()
        {
            --count;
            if (count == 0)
            {  // PLOP
            }
        }
        // A& operator=(A const& copy)
        // do not need to override this as object has
        // already been created and accounted for.
};

//// ソースファイル内:

int A::count = 0;
于 2008-12-01T04:37:34.987 に答える
1

静的変数はどこで定義されていますか? おそらく、ヘッダー ファイルで誤って定義している可能性があり、インライン化によって混乱が生じます (奇妙なことに、コンパイラは複数の定義をキャッチしませんが、決してわかりません)。

class-static 変数が正確に 1 つの翻訳単位で定義されていることを確認してください。次のように定義します。

int MyClass::static_var;

これは、イニシャライザを配置する場所でもあります。

于 2008-12-01T03:52:10.897 に答える
0

「値がずれているように見える」とはどういう意味ですか? 構造が多すぎますか?破壊が足りない?構築が多すぎて破壊が不十分な場合、スタティックとは何の関係もありません。

また、静的変数とはどういう意味ですか? 静的メンバーフィールドまたは実際の静的変数を意味しますか?

ヘッダーで静的変数のみを宣言する場合 (そうするとは思えません)、そのヘッダーを含む各 C ファイルには、その変数の個別のインスタンスが含まれます (グローバル変数の前の static は、そのオブジェクトに限定されることを意味するため)。ファイル)。

于 2008-12-01T03:38:43.247 に答える
0
class A {
public:
    virtual ~A() {
        count --;
        if (count == 0) { // this is the last one, do something }
    }
protected:
    static int count;
};

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

次に、ソース ファイルの 1 つだけに、次のものを配置する必要があります。これは、クラス A のコードを含むソース ファイルに含まれている必要があります。

int A::count(0);

これを行う必要があるのは、ヘッダー ファイルで count という名前の変数が存在することが宣言されているが、その変数にストレージが割り当てられていないためです。ソースファイルに入れなかった場合、リンカはそれが見つからないと文句を言うでしょう。

于 2008-12-01T04:29:19.667 に答える