错误C2259:'class':无法实例化抽象类

时间:2014-07-19 02:04:19

标签: c++ oop abstract-class smart-pointers

现在,我理解了很多关于抽象类的知识,但是,我最近尝试使用抽象类创建一个虚函数来接收消息,然后另一个类具有std::vector的智能指向这个类的指针,但后来我得到了错误C2259。 (是的,我确实查了here

旁注:

我最近也在智能指针上阅读了很多,因为在与指针相关的每个问题中几乎(如果不是总是)提到它们。所以我决定第一次尝试实现它们,所以我的问题可能实际上是因为我不正确地使用了智能指针。

无论如何,这里是纯抽象类本身 -

//Component.h

namespace rpg
{

class Component
{
public:
    virtual void Receive(rpg::Message message) = 0;

    Component();
    virtual ~Component();
};

这是尝试使用纯抽象类的错误的类。

//ContainerObject.h

#include <vector>
#include <memory>
#include "Component.h"

namespace rpg
{

class ContainerObject
{
private:
    //Create short name for a vector of smart pointers to the pure abstract class
    typedef std::vector<std::shared_ptr<rpg::Component>> ComponentList;

    //Create array of Components (std::vector).
    ComponentList myComponents;

public:
    //Send message to all Components in array (std::vector)
    void Send(rpg::Message message)
    {
        if(myComponents.size() > 0)
        {
            for(int i = 0; i < myComponents.size(); i++)
            {
                if(myComponents[i] != NULL)
                {
                    myComponents[i]->Receive(message);
                }
            }
        }
    } // end of Send()

    //Add new Component to array (std::vector)
    void AddComponentToMessageList(rpg::Component& component)
    {
        myComponents.push_back(std::make_shared<rpg::Component>(component));
    }

    ContainerObject();
    ~ContainerObject();
};

} //namespace rpg

首先,我正在努力练习更好的代码组织(我正在学习一些here&lt; - 也是我得到大部分设计的地方)并且我喜欢布局,如果我可以保留它。我还读了一些关于纯抽象类here的内容,我在页面底部看到它们仍然声明了一个指向纯抽象类对象的指针列表,所以我很确定我可以这样使用它,为什么我得到错误C2295,我该如何解决?我可以在哪里实例化它以及导致它被实例化的原因?

(我认为实例化这个术语可能是我真正困惑的部分,这就是为什么我也会问为什么会导致它,所以如果你也可以在你的答案中包含它,那将非常感激。(而且我确实谷歌的定义) ;我仍然感到困惑))

2 个答案:

答案 0 :(得分:4)

void AddComponentToMessageList(std::shared_ptr<rpg::Component>& component)
{
    myComponents.push_back(component);
}

尝试这种方式并在调用AddComponentToMessageList函数之前使用std :: make_shared创建对象。我从未尝试使用复制构造函数实例化具有智能指针的类。从第一眼看,它看起来应该有效,但你永远不知道。

另一个说明。首选接口而不是抽象类。意义创建一个IComponent接口,如下所示:

class IComponent
{
public:
    virtual void Receive(rpg::Message message) = 0;
    virtual ~Component() { };
};

然后让您的类实现此接口。显然你的vector需要改变,成为std :: shared_ptr的容器。

现在我也注意到你不能创建一个抽象类,无论是通过堆栈上的&#34; new&#34;还是std :: make_shared。

答案 1 :(得分:1)

当您在此行中调用make_shared时,您正尝试实例化Component:

myComponents.push_back(std::make_shared<rpg::Component>(component));

make_shared尝试执行new rpg::Component(component)失败,因为Component是抽象的。

相关问题