在类定义中初始化同一个类的对象时出错 - C ++

时间:2011-11-18 14:41:27

标签: c++ object initialization

我正在尝试实现以下类。但是,当我尝试在其定义中实例化该类的对象并传递" 0"作为初始化对象的值,我收到一个错误:

  

"预期类型说明符"。

任何人都可以解释我如何删除此错误?

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

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

};

2 个答案:

答案 0 :(得分:1)

您需要在cpp文件中的类定义之外初始化(定义)它。

MessageType const MessageType::msgEvent;

但是,你这样做的意图不是很清楚。您是否正在尝试实施Singleton模式,可能这个示例实现可能会有所帮助,我会让您自己决定是否真的需要一个单例,尽管它有缺点:

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

答案 1 :(得分: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.

此规则直接适用于您的MessageType实例,与该类属于自己的类型无关。