引用抽象类类型的结构

时间:2011-11-27 20:00:33

标签: c++ arrays pointers vector abstract

基于问题Using array of pointers as parameter to method我想问一下,当有人想要创建一个抽象类的引用结构时,有哪些可用的方法可用。之后它充满了不同的对象,其类显然来自同一个基础。这个结构也必须在作为参数传递的不同类的函数内“转移”。

我遵循链接问题中提出的策略(当然是有缺陷的),因为我无法声明抽象类的对象数组。然而,这可以通过指针数组来实现。可以使用向量完成此操作而不使用如下指针:

vector<Square> allSquares;

?如果向量本身是通过引用(&amp; allSquares)传递的话,那么这种情况下的引用是否保存它们的初始地址?

3 个答案:

答案 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 *>