2

だから私はこのコードを試します:

#ifndef TRANSMITTER_H
#define TRANSMITTER_H
class connector
{   
public:
    static boost::shared_ptr<connector> Instance(){
        if(!instance)
        {
            instance = boost::shared_ptr<connector>(new connector());
        }
        return instance;
    }
private:
    connector(){}
    static boost::shared_ptr<connector> instance;
};
#endif //TRANSMITTER_H

しかし、リンクエラーが発生します:

Error   3   error LNK2001: unresolved external symbol "private: static class boost::shared_ptr<class connector> connector::instance" (?instance@connector@@0V?$shared_ptr@Vconnector@@@boost@@A)

返したい shared_ptr の何が問題になっていますか? 関数スコープの静的変数にしようか?

4

3 に答える 3

14

これ

static boost::shared_ptr<connector> instance;

クラス定義の内部は単なる宣言です。あなたが持っていないように見えるのは、それの定義です。この定義は、クラス定義の外にあります。

ただし、おそらくこれを行うことをお勧めします。

class connector
{   
public:
    connector(connector const&) = delete;
    connector& operator=(connector const&) = delete;

    static boost::shared_ptr<connector> Instance()
    {
        static boost::shared_ptr<connector> instance (new connector);
        return instance;
    }
private:
    connector(){}
};

この場合、 のインライン関数定義内の静的関数ローカル オブジェクトとしてinstance定義Instanceれます。この種の初期化は、C++11 ではスレッドセーフであることが保証されているという利点があります。

于 2012-11-17T15:29:03.860 に答える
2

定義する必要があります

boost::shared_ptr<connector> connector::instance;

あなたの *.cpp でこれにより、リンカーは静的データ領域でこの静的メンバーにメモリを割り当てます。

于 2012-11-17T14:39:31.913 に答える
1

クラス宣言の外で静的メンバーを定義する必要があります。定義は次のようになります。

boost::shared_ptr<connector> connector::instance;

あなたはおそらくtransmitter.cppのために、それはcppにあるはずです

于 2012-11-17T14:40:10.737 に答える