Структура со ссылками на абстрактный тип класса - PullRequest
1 голос
/ 28 ноября 2011

На основе вопроса Использование массива указателей в качестве параметра для метода Я хотел бы спросить, какие возможные способы доступны, когда кто-то хочет создать структуру ссылок на класс, который является абстрактным. После этого он заполняется различными объектами, класс которых, по-видимому, является производным от одной и той же базы. Эта структура также должна быть «передана» внутри функций различных классов, передаваемых в качестве аргумента.

Я следовал стратегии, представленной в связанном вопросе (которая, конечно, ошибочна), потому что я не мог объявить массив объектов абстрактного класса. Однако это достигается с помощью множества указателей. Можно ли это сделать с вектором без использования указателей, таких как:

vector<Square> allSquares;

? Содержат ли ссылки в этом случае свой начальный адрес, если сам вектор передается со ссылкой (& allSquares)?

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Вы не можете передавать или удерживать абстрактные объекты по значению, вы получаете нарезку, упомянутую здесь .По сути, вы теряете все свои данные.Вы должны хранить их по ссылке, по указателю или по умному указателю (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 голосов
/ 28 ноября 2011

A vector<Square> содержит фактические экземпляры самого Square, , а не любого из его подклассов.(C ++ поддерживает полиморфизм только через указатели, а не по значениям.) Поскольку Square является абстрактным классом, не может быть экземпляров самого Square, поэтому vector<Square> в принципе не имеет смысла.Вам нужно использовать vector<Square *>.

0 голосов
/ 28 ноября 2011

Да, хорошо иметь массив абстрактного типа, это часто очень удобно, но вы, вероятно, захотите иметь массив указателей, например:

vector<Square*> allSquares;

вместо просто самих объектов, поскольку размер каждого типа может варьироваться, но указатели c ++ имеют постоянный размер, то есть указатели c ++ в 32-разрядной системе хранятся как int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...