2011-11-18 24 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. 

此相同的规则,直接适用于你的消息类型的实例,并有无关的事实类的它是自己的类型。