Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Центр помощи > [C++] Структура, хранящая обьекты разных типов |
Автор: AlterMann 23.12.2006, 18:14 | ||||||
Здравствуйте, товарищи! (: В общем объясняю проблему. Есть абстрактный класс продукт, который наследуют ещё 4 класса (подтипы продуктов)... Я сделал следующим образом: написал 2 конструктора у класса продукт. Один конструктор - спрашивает у пользователя параметры продукта, другой конструктор (полиморфизм) получает эти данные через сигнатуру (если так можно выразиться (: )... Нужно организовать сохранение объектов подтипов продуктов, в отдельный массив (структуру)... Так вот, я никак не могу придумать как это лучше сделать... По идее, когда объявляешь массив об]ектов подтипов продуктов, то ругается, что неможет найти дефолтовый конструктор, для инициализации элементов массива... Есть другой, очень красивый способ - создание структуры:
Но! Возникает такая некрасивая штука: Объект создаёшь в одной функции, потом передаёшь указатель на него в другую, где уже происходит тот самый ProdList AllProd(MyProduct);. Но после того как указатель (не тот, который *, а который перемещается по коду программы, обеспечивая её работу) выходит за пределы фунции, в которой создаётся обект класса подпродукт - объект уничтожается (область видимости переменной решает)... и получается, что указатель в структуре ProdList, указывает на область памяти, где уже нет объекта... Можно сделать другую структуру, для сохранения, которая будет хранить не указатели на объекты, а сами объекты:
Но! Во-первых, таким образом я не могу сохранить все продукты (разных типов) в одну структуру, т.к. класс продукт является абстрактным (но это ещё куда не шло... тут можно что-нибудь придумать). Во-вторых, когда я добавляю объект в такую структуру следующим образом:
Ругается на пятую строчку, что: "компилятор не может сгенирировать дефолтовый конструктор для класса 'List<PodProductT1>'" Хожу заморачиваюсь этой проблемой уже недели две... А всё никак не могу придумать как же это всё сохранить... Наверняка многие уже сталкивались с такой проблемой и решили её для себя... не подскажите, что мне делать?.. ЗЫ Компилятор (Turbo C++ IDE), надо уже прогу сдавать... блин! ): (: |
Автор: jnb 23.12.2006, 18:56 | ||
Если у тебя проблема только в сохранении разнотипных объектов, имеющих одного предка, в каком-то массиве (векторе, списке), то можешь поступить следующим образом: 1. объявить массив указателей на свой абстрактный родитель 2. создавать объект не на стеке а в куче, через new: таким образом получаешь указатель на конретный объект 3. в массив добавляешь указатель на этот объект ... 4. когда массив становиться не нужен - удаляешь все указатели в нем оператором delete.
|
Автор: Rockie 23.12.2006, 19:41 | ||||||
jnb, на стеке тожде можно, если вытащить ссылку:
AlterMann, конструкторы базового класса нужно явно вызывать в потомках, вот, сделал пример:
|
Автор: jnb 23.12.2006, 20:45 | ||||
без сомнения можно и на стеке, но как мне показалось AlterMann жаловался именно на разрушение объекта: т.е. массив переживает объекты на которые ссылаются его элементы. |
Автор: AlterMann 24.12.2006, 01:59 |
Спасибо большое! очень помогли... ![]() Сильно загнался по поводу связных списков... и запутался... ![]() Таки распутали вы меня! ![]() |
Автор: AlterMann 24.12.2006, 19:33 | ||||||
Скажите, а могу ли я прописать в потомке класса продукт
А затем в функции, где я добавляю элементы массива указателей, на свои разные продукты, использовать этот самый оператор? Если да, то как??? Если написать так:
то не катит, ругается следующим образом:
Подскажите пожалуйста, где я не прав. |
Автор: jnb 24.12.2006, 20:31 |
AlterMann напиши, что конкретно ты хочешь сделать: зачем к одному продукту прибавлять другой? Какого типа у тебя ProductList? Что должна выполнить по твоей задумке инструкция ProductList[i] += p;? А то в моем понимании твой operator+= выполняет добавление к кефиру скажем батона или селедки... |
Автор: AlterMann 24.12.2006, 22:27 | ||
jnb, начну по порядку: ProductList - у меня - массив указателей на объекты подпродуктов (наследников абстрактного класса Product). Вы же мне про этот массив и написали... (: При добавлении продукта проверяется, есть ли уже такой продукт:
(т.е. по идее мне ещё нужно переопределить оператор ==, вернее я его переопределил, но ситуация такая же как и с +=) И если продукт уже есть (по разным параметрам проверяет, типа дата производства, каллорийность), то просто прибавляем новый продукт к уже существующему... |
Автор: AlterMann 25.12.2006, 04:42 | ||
Извините... спасибо... сделал уже... Нужно ж обращаться по указателю
|
Автор: Rockie 25.12.2006, 15:45 | ||
А зачем?.. Нельзя просто счетчик продуктов где-то завести? |
Автор: jnb 25.12.2006, 21:33 | ||
вот так тоже должно работать:
|