2011-11-18 34 views
1

我想實現以下類。然而,當我嘗試實例化的定義中的類的對象,並通過「0」值來初始化對象,我得到一個錯誤:錯誤初始化類定義中的同一類的對象 - C++

"a type specifier is expected".

誰能解釋我如何刪除這個錯誤?

class MessageType 
{ 
public: 
    static const MessageType msgEvent(0); 

private: 
    MessageType(); 
    virtual ~MessageType(); 
    MessageType(int); 

}; 

回答

1

您需要在cpp文件的類定義之外初始化(定義)它。

MessageType const MessageType::msgEvent; 

但是,你這樣做的意圖等都不是很清楚。你想實現一個Singleton模式,可能是這個樣本的實現也許會有幫助,我讓你來決定,你是否真的需要一個單身,inspite它的缺點:

//MessageType.h 
#include <boost/noncopyable.hpp> 
class MessageType: private boost::noncopyable 
{ 
    public: 
    static MessageType* instance(); 

    private: 
    MessageType(); 
    ~MessageType(); 
    static bool g_initialised; 
    // static initialisation 
    static MessageType g_instance; 
    // dynamic initialisation 
}; 

// MessageType.cpp 
#include "MessageType.hpp" 
#include <ostream> 
#include <iostream> 
#include <cstring> 
bool MessageType::g_initialised; 
    // static initialisation 
MessageType MessageType::g_instance; 

    // dynamic initialisation 
MessageType::MessageType() 
{ 
    g_initialised = true; 
} 

MessageType::~MessageType() 
{ 
    g_initialised = false; 
} 

MessageType* MessageType::instance() 
{ 
    return g_initialised ? &g_instance : 0; 
} 
+0

但如果我只是創建一個對象,而不提供初始化值,它工作得很好。 –

+0

@sufyan siddique:它不能正常工作,它只是編譯。最終你會看到鏈接器錯誤。 –

1

只能初始化靜態成員變量在定義中如果它們是int類型的。

class MessageType 
{ 
public: 
    static int sCount = 0; // That is fine. 
    static std::string sLogName; // That is fine. 
    static std::string sLogName("log.txt"); // Fail! 
}; 

沒有辦法繞過這條規則。如果要初始化靜態成員變量,那麼你就必須這樣做,在CPP:

std::string MessageType::sLogName("log.txt"); // fine, in the cpp. 

此相同的規則,直接適用於你的消息類型的實例,並有無關的事實類的它是自己的類型。