2011-11-27 118 views
1

基于问题Using array of pointers as parameter to method我想问当有人想创建一个抽象类的引用结构时,有什么可行的方法可用。之后,它充满了不同的对象,这些对象的类显然是从同一个基础派生而来的。这种结构也必须在不同类别的职能中被“转移”作为论点。引用抽象类类型的结构

我遵循链接问题中提供的策略(当然有缺陷),因为我无法声明抽象类的对象数组。但是,这可以通过指针数组来实现。这可以通过使用一个载体来完成,而不使用像这样的指针:

vector<Square> allSquares; 

?如果矢量本身通过参考传递(& allSquares),那么这种情况下的引用是否保留其初始地址?

回答

0

是的,这是罚款,有一个抽象类型的数组,它往往是很方便,但你可能会希望有一个指针数组,即:

vector<Square*> allSquares; 

,而不是简单的对象本身,因为每种类型的大小可能会有所不同,但C++指针的大小是不变的,也就是说,32位系统上的C++指针被存储为int。

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. 
+0

或boost :: ptr_vector <>。 ptr_vector获取所有包含的指针的所有权。它的接口还返回对象的引用(而不是指针),因此可以更容易地与标准算法一起使用(因为您不需要对迭代器进行两次去引用)。 –

0

一个vector<Square>包含Square自身的实际情况,其任何的子类。 (C++仅支持通过指针而不是值的多态性。)由于Square是一个抽象类,因此它本身不会有任何实例,因此vector<Square>基本上没有意义。您需要使用vector<Square *>