Как выделить память в этой функции? - PullRequest
0 голосов
/ 04 декабря 2010

У меня есть следующая функция и иерархия классов, так что Multinumber наследуется Pairs, Rational и Complex.Все эти общие функции, которые являются виртуальными в Multinumber.Моя проблема в следующем коде.Как это написано прямо сейчас, переменная newElement выходит из области видимости, когда она добавляется в мой setArray типа Multinumber**, и мне нужно найти какой-то способ выделить память в этой функции.Как ни странно, параметры, которые передаются в функцию, даже если они напечатаны в первой строке, всегда пустые, когда я делаю cout<<newElement->tostring(); Может кто-нибудь сказать мне, что здесь не так?плакат правильный, это домашнее задание

Ответы [ 3 ]

1 голос
/ 04 декабря 2010

Во избежание проблем с памятью замените Multinumber** setArray на std::vector<boost::shared_ptr<Multinumber>> setArray.

0 голосов
/ 04 декабря 2010

В реальном мире (я понимаю из вашего предыдущего вопроса , что это для домашней работы), вы бы не реализовали свой собственный набор. Стандартная библиотека предоставляет эту функциональность (std::set, если вы хотите сохранить элементы в порядке; std::unordered_set, если вы используете C ++ 0x и / или имеете соответствующие расширения, и устанавливаете приоритет скорости над дополнительными функциями).

Вероятно, вам также следует взглянуть на некоторые классы интеллектуальных указателей.

Это говорит:

В вашем коде newElement не выходит за рамки. Что происходит, так это то, что вам дали указатель на данные вызывающего кода, и затем вызывающий код позволяет указанным объектам выйти из области видимости.

Когда я ответил на ваш предыдущий вопрос, вам нужно использовать «1016 * виртуальный клон идиома», чтобы сделать копию.

По сути, вы хотите вызывать new с любым типом передаваемой, наведенной, таким образом, чтобы была сделана копия. Чтобы убедиться, что «копия сделана», естественным будет использовать конструктор копирования с new, то есть new whatever(my_existing_whatever_instance). Но в C ++ конструкторы не могут быть virtual, поэтому мы не можем фактически поместить желаемый тип в вызов new. Вместо этого мы должны подделать его с помощью функции-члена. Поскольку функции-члены могут быть virtual, правильная версия clone ищется в фактической наведенной вещи, которая реализована для вызова new с использованием своего собственного типа и вызова своей собственной копии конструктор. Ссылка содержит подробную информацию.

0 голосов
/ 04 декабря 2010

Если вам нужно, чтобы он вырос, сделайте его типа vector<Multinumber*> и используйте setArray.push_back (newElement).

Необходимо убедиться, что вызывающая сторона поддерживает элемент живым, пока векторв живых.Если нет, возможно, добавьте виртуальный метод Clone в Multinumber, который возвращает копию (и подклассы реализуют ее).Тогда push_back(newElement->Clone()).

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