0

静的ポインタメンバーを持つ基本クラスがあります。派生クラスでその静的ポインターメンバーを割り当てると、基本クラスのメソッドから参照されると、その静的メンバーはNULLになります。

これは私が期待する動作ではありません。アクセス先に関係なく、静的ポインタメンバーを割り当てる必要はありませんか?期待される動作について間違っていますか?

静的メンバーは、基本クラスへのポインターです。私が達成しようとしていることは、おそらくテンプレートを使用した静的ポリモーフィズム(静的ポリモーフィズムの定義と実装)によって最もよく達成されることを理解していますが、このシナリオでポインターメンバー自体がNULLである理由はまだわかりません。

編集:このSSCEでは動作は示されていません。私が説明する動作の原因となるバグや一般的なエラーは何ですか?私の実際の制作シナリオはこれよりもかなり複雑ですが、構造はほとんど同じです。私は文字通りVS2010デバッガーを監視していBase::staticMember == not nullて、を呼び出してBase::staticMethod()、内部がnullBase::staticMethod()になっています。Base::staticMember私は困惑しています。

#include <iostream>

class Base {
public:
    static Base *staticMember;

    static void baseMethod();
};

Base *Base::staticMember = NULL;

class Derived : public Base {
public:
    void derivedMethod();
};

void Base::baseMethod() {
    // here staticMember == NULL, the unexpected behavior
    if(staticMember == NULL) {
        std::cout << "NULL";
    } else {
        std::cout << "NOT NULL";
    }
};

void Derived::derivedMethod() {
    staticMember = new Derived();
}

int main(int argc, void *argv[]) {
    Derived *derived = new Derived();
    derived->derivedMethod();
    Base::baseMethod();
}
4

4 に答える 4

2

あなたのコンパイラは明らかにここで問題です.

int main(int argc, void *argv[])

Derived derived = new Derived();

たとえば、 ideone の結果を参照してください。staticメンバーは明らかに nullであってはなりません。

于 2012-11-30T02:07:49.920 に答える
1

コードの修正および簡略化されたバージョンの再現なし:

#include <iostream>
#include <iomanip>

struct Base {
    static Base* staticMember;

    static void baseMethod();
};

Base* Base::staticMember;

void Base::baseMethod() {
    std::cout << std::boolalpha << (staticMember == nullptr) << std::endl;
}

struct Derived : Base {
    void derivedMethod();
};

void Derived::derivedMethod() {
    staticMember = this;
}

int main() {
    Derived derived;
    derived.derivedMethod();

    Base::baseMethod();
}

「false」を出力します。

短い、自己完結型、正しい (コンパイル可能)、例を常に提供しないと、質問は無意味になります。

于 2012-11-30T02:13:53.863 に答える
0

誤って class Derived { static Base *staticMember; を宣言した可能性があります。};

したがって、2 つの staticMembers が浮かんでいます。

これが、私のような人々が根拠のない推測をしないようにするために、SSCE が役立つ理由です。

于 2012-11-30T04:17:35.757 に答える
0

前述のとおり、SSCE は機能しますが、prod コードは機能しません。次のような変更を加えた場合:

void Derived::derivedMethod() 
{
    Base::staticMember = new Derived();
}

これにより、話している変数がコンパイラに明示的に伝えられ、ベースメンバーを誤って隠している場合が発生する可能性があります。

(gccが必要かもしれないと思いますBase::staticMember-おそらくこの正確なケースではありません)

于 2012-11-30T03:05:25.990 に答える