基于问题Using array of pointers as parameter to method我想问一下,当有人想要创建一个抽象类的引用结构时,有哪些可用的方法可用。之后它充满了不同的对象,其类显然来自同一个基础。这个结构也必须在作为参数传递的不同类的函数内“转移”。
我遵循链接问题中提出的策略(当然是有缺陷的),因为我无法声明抽象类的对象数组。然而,这可以通过指针数组来实现。可以使用向量完成此操作而不使用如下指针:
vector<Square> allSquares;
?如果向量本身是通过引用(&amp; allSquares)传递的话,那么这种情况下的引用是否保存它们的初始地址?
答案 0 :(得分:2)
你不能按值传递或保持抽象对象,你得到切片,提到here。基本上,您丢失了所有数据。您必须通过引用,指针或智能指针(shared_ptr)存储它们。
到目前为止,最简单的方法是将所有抽象对象作为shared_ptrs进行管理。这样您就不必处理复杂的生命问题。当您的对象不再需要时,它们将自行删除。
以下是使用此方法的示例语法。
std::vector<boost::shared_ptr<Shape> > shapes;
shapes.push_back(boost::make_shared<Rect>());
boost::shared_ptr<Shape> foo = shapes[0];
foo->draw(); //Draws the rectangle.
答案 1 :(得分:0)
是的,有一个抽象类型的数组很好,它通常非常方便,但你可能想要一个指针数组,即:
vector<Square*> allSquares;
而不仅仅是对象本身,因为每种类型的大小可以变化,但c ++指针的大小是不变的,也就是说,32位系统上的c ++指针存储为int。
答案 2 :(得分:0)
vector<Square>
包含Square
本身的实际实例,不是的任何子类。 (C ++仅通过指针支持多态,而不支持值。)由于Square
是一个抽象类,因此Square
本身不存在实例,因此vector<Square>
基本上没有意义。您需要使用vector<Square *>
。