抽象类中的向量

Vector in an abstract class

本文关键字:向量 抽象类      更新时间:2023-10-16

我相信这里的问题很相似,但我仍然需要更多澄清。

假设我在抽象类(存储另一个类的对象(中创建了一个向量。如果我无法初始化抽象类的对象,我将如何使用另一个类的 .pushback((?

显然,最简单的解决方案是将向量放在另一个类中,但我需要另一种方法。我读过你可以通过在向量中存储指向这些对象的指针来做到这一点。但是有人可以给我举个例子吗?

抽象类的目的是提供一个接口,然后在具体的派生类中实现该接口。

如果要将项推送到作为抽象类的数据成员的向量上,请创建一个适当的派生类,然后可以创建该派生类的实例,该实例将包含可以向其添加条目的向量。

class Base{
public:
virtual void do_stuff()=0; // this is an abstract base class
protected:
std::vector<int> data;
};
class Derived: public Base
{
public:
void do_stuff() {
// concrete implementation
data.push_back(42); // can add values to vector inherited from base class
}
};
int main()
{
Derived d;
d.do_stuff(); // will add entries to d.data
}

但是,我想知道这是否真的是您要实现的目标。

我可以找到一些现有的SO答案,但他们使用的是C++98代码。

在该基类中存储抽象基类向量的正确方法是具有指向抽象基类的智能指针向量。

首先,添加向量和虚拟析构函数

struct AbstractBase {
virtual ~AbstractBase(); // <-- this makes sure these shenanigans don't cause memory leaks
std::vector<std::unique_ptr<AbstractBase>> children;
};

然后push_back新的派生类:

struct Derived1 : public AbstractBase; // defined elsewhere
/*...*/
base.children.push_back(std::make_unique<Derived1>());
//or
auto child = std::make_unique<Derived1>();
base.children.push_back(std::move(child));

它必须是在堆上分配的指针向量,因为 vector 从基类中不知道派生类的大小以直接存储它们。

它必须是智能指针的向量,因为当您使用指针和堆分配时,必须有人负责清理它们。智能指针会自动执行此操作。

最后,抽象基类中的虚拟析构函数可确保即使您使用已强制转换为抽象基类的指针,它也会调用正确的析构函数来清理所有内容。