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

error C2259: 'class' : cannot instantiate abstract class

本文关键字:实例化 抽象类 C2259 错误      更新时间:2023-10-16

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

旁注:

我最近也读了很多关于智能指针的文章,因为几乎(如果不是总是(在每个与指针有关的问题中都会提到它们。所以我决定第一次尝试实现它们,所以我的问题实际上可能是因为我对智能指针的使用不当。

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

//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

首先,我正在努力练习更好的代码组织(我在这里学习了一些<——也是我获得大部分设计的地方(,如果我能保留它的话,我喜欢它的布局。我还在这里读到了一些关于纯抽象类的文章,我在页面底部看到,它们仍然声明了一个指向纯抽象类对象的指针列表,所以我很确定我可以这样使用它,那么为什么我会出现错误C2295,我该如何修复它呢?我可以在哪里实例化它,是什么导致它被实例化?

(我认为实例化这个词可能是真正让我困惑的部分,这就是为什么我也问它是什么原因造成的,所以如果你能把它也包括在你的答案中,那将不胜感激。(我确实在谷歌上搜索了它的定义;我仍然很困惑((

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() { };
};

然后让你的类实现这个接口。显然,您的向量需要更改,成为std::shared_ptr的容器。

现在我还注意到,无论是通过"new"、在堆栈上还是std::make_shared,都无法创建抽象类。

当您在以下行中调用make_shared时,您正在尝试实例化组件:

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

CCD_ 3尝试执行CCD_ 4,由于CCD_。