我正在尝试实现以下类。但是,当我尝试在其定义中实例化该类的对象并传递" 0"作为初始化对象的值,我收到一个错误:
"预期类型说明符"。
任何人都可以解释我如何删除此错误?
class MessageType
{
public:
static const MessageType msgEvent(0);
private:
MessageType();
virtual ~MessageType();
MessageType(int);
};
答案 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实例,与该类属于自己的类型无关。