多级继承错误C2280:“试图引用已删除的函数”

时间:2017-08-05 09:59:51

标签: c++ inheritance

我正在用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),我永远不会使用它独自一人。

我可以做些什么来规避这个错误?我的设计有缺陷吗?如果是这样,我该如何以不同的方式实现呢?

1 个答案:

答案 0 :(得分:0)

已删除的函数是CIrcEvent的默认构造函数。它有一个用户定义的构造函数,然后必须从派生类调用该构造函数。

您未在CCommand中定义任何构造函数,因此&#34;编译器已生成&#39; CCommand :: CCommand&#39;&#34; 。这样一个编译器生成的构造函数也会调用基类&#39;默认构造函数 - 但基类没有一个!