簡體   English   中英

C ++:對Singleton類中實例的未定義​​引用

[英]C++: Undefined reference to instance in Singleton class

我目前正在嘗試將工廠實施為單身人士。 我幾乎使用了Singleton模式的教科書示例。 這是.h文件:

namespace oxygen{

class ImpFactory{

public:
    static boost::shared_ptr<ImpFactory> GetInstance();

private:
    static boost::shared_ptr<ImpFactory> mInstance;
};

這是.cpp文件:

#include "impfactory.h"

using namespace oxygen;
using namespace boost;

shared_ptr<ImpFactory> ImpFactory::GetInstance(){
    if (mInstance.get() == 0)
        mInstance = shared_ptr<ImpFactory>(new ImpFactory());
    return mInstance;
}

代碼編譯,但我收到鏈接器錯誤:

../../lib/oxygen/liboxygen.so.3.2.4:未定義引用`oxygen :: ImpFactory :: mInstance'

這目前有三名學生難倒。 有任何想法嗎?

您必須定義靜態實例,而不僅僅是聲明它。 該定義創建您引用的實際對象。

在您的cpp文件中,添加以下行:

boost::shared_ptr<ImpFactory> ImpFactory::mInstance;

您需要在cpp文件中定義靜態成員。

boost::shared_ptr<ImpFactory> ImpFactory::mInstance;

在你的c ++中添加:

boost::shared_ptr<ImpFactory> ImpFactory::mInstance;

另一方面,也許你應該讓實例指針成為get函數的靜態成員而不是類,這在使用new / pointer方法時沒有太大的區別。 但是如果你只是創建一個靜態實例(即不使用指針,並從get get函數返回對它的引用),這會產生很大的不同,因為:

如果它是一個類的靜態成員,它的構造函數每當被調用(因為它是一個全局的)如果它是get函數的靜態成員,它就不構造,直到它第一次被調用,這緩解了人們的一些問題。對於單例並且它們是美化全局變量,另一個好處是,大多數鏈接器將省略get函數,因此如果它從未被調用則完全靜態實例,因此您不必擔心調用new以便它只使用內存如果它被使用。

由於您正在使用Boost,您可能需要考慮Boost單例類。 查看:

#include <boost/serialization/singleton.hpp>

using namespace boost::serialisation;

struct MyClass : public singleton<MyClass>
{ string name_; int age_; };

int main( int argc, char* argv[] )
{
    MyClass::get_mutable_instance().name_ = "Robin";
    MyClass::get_mutable_instance().age_ = 21;
}

你使用哪個取決於你正在做什么。 雖然我出於通常的原因而有點反單身,但在可能的情況下重復使用是有意義的。 但是有一個警告:Boost單例似乎在庫中移動了一些,所以這可能會有所不同,具體取決於你正在使用的Boost版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM