我正在用C ++制作一个IRC机器人,它应该对IRC频道中的消息作出反应。 IRC频道属于多人游戏服务器,人们可以在游戏中与IRC进行通信,反之亦然。 (基本上你可以看到服务器上发生的事情,包括聊天,而不必真正进入游戏)。
我有一个非常基本的类层次结构,用于表示逐渐更具体的IRC事件类型。 Represented on a graph it looks like this
现在,我正在尝试在C ++中实现这种多级继承,就像这样(请原谅我不一致的样式。我也省略了CIrcCommand,因为它与CIngameCommand非常相似,并且有同样的问题)
CIrcEvent
class CIrcEvent
{
protected:
EventType m_type;
private:
void(*HandlerFunc)(std::string& nick, std::string& chan, std::vector<std::string>& message);
public:
CIrcEvent(void(*handler_ptr)(std::string& nick, std::string& chan, std::vector<std::string>& message))
{
m_type = EventType::IRCEVENT;
HandlerFunc = handler_ptr;
}
};
的CCommand
class CCommand : public CIrcEvent
{
protected:
std::string m_name;
int m_level;
public:
std::string& GetCommandName() { return this->m_name; }
int GetLevel() { return this->m_level; }
};
CIngameCommand
class CIngameCommand : public CCommand
{
public:
CIngameCommand(std::string& CmdName, int CmdLevel, void(*CmdFuncPointer)(std::string& nick, std::vector<std::string>& message))
{
m_type = EventType::IGCMD;
m_name = CmdName;
m_level = CmdLevel;
HandlerFunc = CmdFuncPointer;
}
void Call(std::string& nick, std::vector<std::string>& message) { HandlerFunc(nick, message); }
private:
void(*HandlerFunc)(std::string& nick, std::vector<std::string>& message);
};
但是在类CIngameCommand的构造函数定义中......
CIngameCommand(std::string& CmdName, int CmdLevel, void(*CmdFuncPointer)(std::string& nick, std::vector<std::string>& message))
{ // <-- error on this line
m_type = EventType::IGCMD;
...我收到了C2280错误。
IRCCommand.h(63): error C2280: 'CCommand::CCommand(void)': attempting to reference a deleted function
IRCCommand.h(43): note: compiler has generated 'CCommand::CCommand' here
我不确定我做错了什么。我知道我没有为CCommand类定义一个自定义构造函数,但那是因为与其他所有构造函数相反,我只打算使用CCommand的派生类(CIngameCommand和CIrcCommand),我永远不会使用它独自一人。
我可以做些什么来规避这个错误?我的设计有缺陷吗?如果是这样,我该如何以不同的方式实现呢?
答案 0 :(得分:0)
已删除的函数是CIrcEvent
的默认构造函数。它有一个用户定义的构造函数,然后必须从派生类调用该构造函数。
您未在CCommand
中定义任何构造函数,因此&#34;编译器已生成&#39; CCommand :: CCommand&#39;&#34; 。这样一个编译器生成的构造函数也会调用基类&#39;默认构造函数 - 但基类没有一个!