我相信问题here是相似的,但是我仍然需要对其进行更多的澄清。
比方说,我在抽象类(存储另一个类的对象)中创建了一个向量。如果我不能初始化抽象类的对象,怎么能从另一个类使用.pushback()?
显然,最简单的解决方案是将向量放在另一个类中,但是我需要另一种方式。我读过您可以通过将指向这些对象的指针存储在向量中来做到这一点。但是有人可以给我一个例子吗?
答案 0 :(得分:2)
抽象类的目的是提供一个接口,然后在具体的派生类中实现该接口。
如果要将项目推到作为抽象类的数据成员的向量上,则创建一个适当的派生类,然后可以创建该派生类的实例,从而将包含一个向量,您可以添加条目
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
}
但是,我想知道这是否真的是您要实现的目标。
答案 1 :(得分:0)
我可以找到一些现有的SO答案,但是它们使用的是C ++ 98代码。
在抽象基类中存储抽象基类向量的 right 方法是在抽象基类中使用智能指针的向量。 >
首先,添加向量和虚拟析构函数
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));
它必须是在堆上分配的指针的向量,因为向量从基类中不知道派生类直接存储它们的大小。
它必须是智能指针的向量,因为当您使用指针和堆分配时,必须由某人负责清理它们。智能指针会自动执行此操作。
最后,抽象基类中的虚拟析构函数可确保即使您使用的是已转换为抽象基类的指针,也将调用正确的析构函数来清理所有内容。