抽象类中的向量
Vector in an abstract class
我相信这里的问题很相似,但我仍然需要更多澄清。
假设我在抽象类(存储另一个类的对象(中创建了一个向量。如果我无法初始化抽象类的对象,我将如何使用另一个类的 .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 从基类中不知道派生类的大小以直接存储它们。
它必须是智能指针的向量,因为当您使用指针和堆分配时,必须有人负责清理它们。智能指针会自动执行此操作。
最后,抽象基类中的虚拟析构函数可确保即使您使用已强制转换为抽象基类的指针,它也会调用正确的析构函数来清理所有内容。
相关文章:
- 无法创建抽象类的实例
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 抽象类中的向量
- 删除指向抽象类的指针向量
- 如何在C++中声明抽象类的向量列表?
- 遍历抽象类的向量
- 抽象类向量的C++向量
- 具有继承类和函数的抽象类写入单独的向量c++
- 指向模板抽象类的指针向量
- 创建一个抽象类类型的集合,shared_ptr的抽象类向量
- 列表与向量与抽象类
- 本征矩阵和向量之上的抽象类
- 抽象类的shared_ptr向量到副本的向量
- visual C++无法访问抽象类的向量的元素
- 向量和抽象类
- 如何在c++中实现与抽象类指针向量的缓存一致性
- 无法为向量和抽象类特化模板函数
- 从抽象类的指针向量调用函数
- C++访问抽象类指针向量的子类的成员
- 指向抽象类的指针向量