2009-07-14 31 views
2

私はこの文に未定義の参照のエラーメッセージ、取得しています:未定義の参照 - C++リンカエラー

GlobalClass *GlobalClass::s_instance = 0; 

に任意のアイデア?コードを以下に示します。

=========================================を=======

#ifndef GLOBALCLASS_H_ 
#define GLOBALCLASS_H_ 

#include <string> 
class GlobalClass { 

public: 

    std::string get_value(); 

    void set_value(std::string); 

    static GlobalClass *instance(); 

    static GlobalClass *s_instance; 

private: 

    std::string m_value; 
}; 

#endif /* GLOBALCLASS_H_ */ 

==================================== ===========

#include <string> 
#include "GlobalClass.h" 



/* 
GlobalClass(int v = 0) 
{ 
m_value = v; 
} 
*/ 

    static GlobalClass *s_instance; 

    std::string GlobalClass::get_value() 
    { 
     return m_value; 
    } 

    void GlobalClass::set_value(std::string v) 
    { 
     m_value = v; 
    } 

    static GlobalClass *instance() { 
     if (!s_instance) 
      s_instance = new GlobalClass; 
     return s_instance; 
    } 

================================ =============================

#include <iostream> 
#include "GlobalClass.h" 

using namespace std; 

int main() { 

    GlobalClass::s_instance = 0; 


    std::string myAddress = "abc"; 
    GlobalClass::instance()->set_value(myAddress); \\ <=== compiler error 
    std::cout << "====>address is is " << GlobalClass::instance()->get_value() 
      << std::endl; 
    return 0; 
} 
+1

次の2つのGlobalClass定義、s_instanceないものを持っている...それは混乱を引き起こしていませんか? – Eli

+0

Doh、私は間違ったファイルをコピーしました - ありがとう。 –

+0

体の編集を続けます。'GlobalClass :: instance() - > set_value(myAddress)'または 'GlobalClass * GlobalClass :: s_instance = 0; 'のエラーですか?それははっきりしていません。 –

答えて

4

シングルトンクラスを実装しようとしていますか?つまりクラスのインスタンスは1つだけで、クラスを含むすべての人がそのインスタンスを使用できるようにします。

Singleton.h::私は、一般的にシングルトンとして知られると思いますが、次の例では、期待どおりに動作

#include <string> 
class Singleton 
{ 
public: 
    static Singleton* instance() 
    { 
     if (p_theInstance == 0) 
      p_theInstance = new Singleton; 
     return p_theInstance; 
    } 
    void setMember(const std::string& some_string) 
    { 
     some_member = some_string; 
    } 
    const std::string& get_member() const 
    { 
     return some_member; 
    } 

private: 
    Singleton() {} 
    static Singleton* p_theInstance; 
    std::string some_member; 
}; 

Singleton.cppを:

Singleton* Singleton::p_theInstance = 0; 

main.cppに:

#include <string> 
#include <iostream> 
#include "Singleton.h" 

int main() 
{ 
    std::string some_string = "Singleton class"; 
    Singleton::instance()->setMember(some_string); 
    std::cout << Singleton::instance()->get_member() << "\n"; 
} 

コンストラクタがprivateで、私たちは誰もが私たちのシングルトンのインスタンスを作成することにしたくないことを注意、U 'instance()'演算子を使用しないでください。

+0

なぜヘッダーファイルにはその中のメソッドの定義がありますか? –

+0

それは私が怠け者で、そこにそれらを書こうとしたくないということでした。しかし、上記のコードはまだ有効です。コンパイルしてテストしました。 – DeusAduro

+0

私はそれを試して、 "include Singleton.h"をSingleton.cppに追加すると、コンパイルして実行します。私はそれをメインプロジェクトに入れて、それが機能するかどうかを調べるつもりです。ありがとう! –

0

あなたがしたいことがわかっているのは、私の問題ですこれは

GlobalClass::s_instance = 0; 
+0

はい、ありがとうございました。私は次のものに転記しました... –

3

あなたの.hファイル内の静的フィールドs_instanceを宣言すると、それだけでこのフィールドはどこかに存在しているコンパイラに指示します。これにより、main関数で参照することができます。ただし、フィールドはどこにも定義されていません。つまり、メモリが予約されておらず、初期値も割り当てられていません。これは、関数プロトタイプ(通常は.hファイル)と関数定義(.cppファイル)の違いに似ています。

実際にフィールドを定義するためには、あなたが(ない任意の関数内)グローバルスコープであなたの.cppファイルに次の行を追加する必要があります。

GlobalClass* GlobalClass::s_instance = 0; 

あなたが追加しないことが重要ですこの定義にstatic修飾子(あなたはまだ.hファイルにクラス内の宣言にstatic修飾子を持つ必要がありますが)。クラス外の定義にstaticとマークされている場合、その定義は同じ.cppファイル内でのみ使用できます。リンカーは、他の.cppファイルで使用されている場合に存在しないかのように動作します。 staticのこの意味は、クラスの内部および関数内staticからstaticは異なっています。私はなぜ言語設計者が3つの異なるものに対して同じキーワードを使用したのかは分かりませんが、それはその方法です。

+0

ジェイ、私はあなたが示唆したように、説明が理にかなっている。残念ながら、私はまだ2つの残りの参照に同じリンカエラーを取得しているMainClassに行くGlobalClass ... –

+0

ジェイ、ありがとう、ありがとう、cppファイルの静的プロパティも宣言する必要があります – jondinham