2011-11-18 2 views
1

다음 클래스를 구현하려고합니다.클래스 정의 내에서 동일한 클래스의 객체를 초기화하는 중 오류가 발생했습니다. - C++

"a type specifier is expected".

사람이 내가이 오류를 제거 할 수있는 방법을 설명 할 수 : 나는 그것의 정의 내에서 클래스의 객체를 인스턴스화하고 개체를 초기화하는 값으로 "0"을 통과 할 때 그러나, 나는 오류가?

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

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

}; 

답변

1

cpp 파일의 클래스 정의 외부에서 초기화해야합니다.

MessageType const MessageType::msgEvent; 

그러나 일에있는 당신의 의도는 그래서 매우 명확하지 않다.

//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

당신은 정적 멤버 변수를 초기화 할 수 있습니다 : 당신은 아마이 샘플 구현이 도움이 될 수도, 싱글 톤 패턴을 구현하기 위해 노력하고있다, 나는 당신이 정말 그 단점, inspite 싱글 필요한지 여부를 결정하도록 맡겨 그것들이 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. 

이 동일한 규칙이 메세지 유형의 인스턴스에 직접 적용되며, 클래스의 사실과는 아무 상관이 없습니다 그것은 자신의 유형입니다.

관련 문제