2011-12-30 17 views
0

GetStudent()関数がStudentの一意のインスタンスを返すと予想しました。私が期待したように、その関数はStudentクラスの一意のインスタンスを返します。 GetStudent()関数が返すメモリアドレスを二重チェックしました。しかし、私がGetSutent()関数を呼び出すたびにStudentのコンストラクタが呼び出されるというのは非常に奇妙なことでした。コードは以下のようになります。プログラミング環境はVC6.0 & MFCプロジェクトでした。C++ -usingファイルスコープ静的関数

//someApp.h 
    Student& GetStudent(); 


    //someApp.cpp 
    Student& GetStudent() 
    { 
     static Student _student; 
     return _student; 
    } 


    //client1Class.cpp 
    #include "someApp.h" 
    void CCliend1Class::DoSomething() 
    { 
     GetStudent().DoSomething(); 
    } 



    //client2Class.cpp 
    #include "someApp.h" 
    void CClient2Class::DoSomething() 
    { 
     GetStudent().DoSomething(); 
    } 
+0

あなたは 'DoSomething()'のどこかに別の '学生 'を作成していませんか? – lapk

+0

コードを追加しました返されたStudentオブジェクトへのポインタをどのようにチェックしましたか、いくつかの一時オブジェクトがコンストラクタを複数回呼び出す原因と思われます。 – marcinj

+0

luskan // int adrr =&GetSudent() – webnoon

答えて

1

GetStudent()内のオブジェクトが唯一の関数が呼び出された最初の時間を構築する必要があります(その関数を呼び出す別のスレッド間での競合が存在しないと仮定すると、私はスレッドの場合に何が起こるかわからないが、この質問ではない)。実際には、アプリケーション全体でこの関数から戻されるオブジェクトは1つだけにする必要があります。

ところで、これは "ファイルスコープ静的関数"ではなく、 "関数スコープ静的変数"に関するものです。

+0

私の質問を編集できます:)ありがとうございます。 – webnoon

+0

私は、マルチスレッド環境でGetStudent()が別のスレッド間で呼び出された原因がどのように働くのだろうかと思います。 – webnoon

関連する問題