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

error initializing an object of the same class within class definition - C++

本文关键字:对象 c++ 一类 出错 定义 初始化      更新时间:2023-10-16

我正在尝试实现以下类。然而,当我尝试在其定义内实例化类的对象并传递"0"作为初始化对象的值时,我得到一个错误:

"需要一个类型说明符"。

谁能解释我怎么才能消除这个错误?

class MessageType
{
public:
    static const MessageType  msgEvent(0);
private:
    MessageType();
    virtual ~MessageType();
    MessageType(int);
};

您需要在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;
 }

只能在定义中初始化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实例,与类是它自己的类型无关。