1

私の思考がどこに欠陥があるのか​​正確にはわからないので、たぶんあなたは私のために何かをクリアすることができるでしょう。最初のいくつかのコード:

Talker.h:

class talker       
{
    public:
    talker();
    void sayHello() {cout << "Hello";} ;
};

anotherClass.h:

class anotherClass
{
    public:
    anotherClass();
    void doSomethingYourself() { cout << "will do"; };
    void askHimToSayHello() { pointerToTalker->sayHello; };  
                          //Access violation, bad pointer(?)
};

common.h:

 static talker *pointerToTalker;       
      // if I add here "= new talker", code works fine

main.cpp:

#include "common.h"
int main()
{
    pointerToTalker = new talker;            // Here is the bug, but why?
    pointerToTalker -> sayHello;             // says Hello alright

    anotherClass *pointerToAnotherClass = new anotherClass;
    pointerToAnotherClass -> doSomething ();  //Does something OK

    pointerToAnotherClass -> askHimToSayHello(); // Causes access violation 
}

もちろん、関数はもう少し複雑で、それぞれが「common.h」を含む対応する.cppに実装されています。私の質問は-main()内で初期化された場合、pointerToTalkerがanotherClass :: AskHimToSayHello()内で機能しないのはなぜですか?そこで使用されるまでに、有効なメモリを指している必要があります。私の「Helloworld、OOP!」です。ところで、私に希望がない場合は、優しくしてください:)

ちなみに子供っぽいスタイルでごめんなさい。全体像を失うことなく、必要なコードをよりコンパクトなものに削減するのに役立ちます:)。

4

1 に答える 1

5

なぜなら

static talker *pointerToTalker;   

グローバルではありません。このコンテキストでstaticは、が含まれている各変換ユニット(cppファイル+含まれてcommon.hいるファイル)の可変内部リンケージを提供します。

あなたはそれを次のように宣言する必要がありますextern

extern talker *pointerToTalker;   

単一の実装ファイルで初期化します。

宣言すると、各翻訳単位staticのコピーが作成されます。pointerToTalkerつまり、からのものを初期化していますmain.cpp。その他は初期化されないままであるため、未定義の動作に遭遇します。適切な方法は次のとおりです。

//common.h:
extern talker *pointerToTalker;    

//common.cpp
#include "common.h"
talker* pointerToTalker = new talker;
于 2012-05-04T08:12:16.580 に答える