|
Модераторы: Poseidon |
|
AlterMann |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
Здравствуйте, товарищи! (:
В общем объясняю проблему. Есть абстрактный класс продукт, который наследуют ещё 4 класса (подтипы продуктов)... Я сделал следующим образом: написал 2 конструктора у класса продукт. Один конструктор - спрашивает у пользователя параметры продукта, другой конструктор (полиморфизм) получает эти данные через сигнатуру (если так можно выразиться (: )... Нужно организовать сохранение объектов подтипов продуктов, в отдельный массив (структуру)... Так вот, я никак не могу придумать как это лучше сделать... По идее, когда объявляешь массив об]ектов подтипов продуктов, то ругается, что неможет найти дефолтовый конструктор, для инициализации элементов массива... Есть другой, очень красивый способ - создание структуры:
Но! Возникает такая некрасивая штука: Объект создаёшь в одной функции, потом передаёшь указатель на него в другую, где уже происходит тот самый ProdList AllProd(MyProduct);. Но после того как указатель (не тот, который *, а который перемещается по коду программы, обеспечивая её работу) выходит за пределы фунции, в которой создаётся обект класса подпродукт - объект уничтожается (область видимости переменной решает)... и получается, что указатель в структуре ProdList, указывает на область памяти, где уже нет объекта... Можно сделать другую структуру, для сохранения, которая будет хранить не указатели на объекты, а сами объекты:
Но! Во-первых, таким образом я не могу сохранить все продукты (разных типов) в одну структуру, т.к. класс продукт является абстрактным (но это ещё куда не шло... тут можно что-нибудь придумать). Во-вторых, когда я добавляю объект в такую структуру следующим образом:
Ругается на пятую строчку, что: "компилятор не может сгенирировать дефолтовый конструктор для класса 'List<PodProductT1>'" Хожу заморачиваюсь этой проблемой уже недели две... А всё никак не могу придумать как же это всё сохранить... Наверняка многие уже сталкивались с такой проблемой и решили её для себя... не подскажите, что мне делать?.. ЗЫ Компилятор (Turbo C++ IDE), надо уже прогу сдавать... блин! ): (: Это сообщение отредактировал(а) AlterMann - 23.12.2006, 18:20 |
||||||
|
|||||||
Rockie |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 13 Всего: 31 |
AlterMann, если есть базовый класс Base и его потомки Derived1 и Derived2, то можно создать массив указателей на базовый класс, а потом создавать объеты потомков.
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
jnb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 4.10.2006 Репутация: 1 Всего: 1 |
Если у тебя проблема только в сохранении разнотипных объектов, имеющих одного предка, в каком-то массиве (векторе, списке), то можешь поступить следующим образом:
1. объявить массив указателей на свой абстрактный родитель 2. создавать объект не на стеке а в куче, через new: таким образом получаешь указатель на конретный объект 3. в массив добавляешь указатель на этот объект ... 4. когда массив становиться не нужен - удаляешь все указатели в нем оператором delete.
|
|||
|
||||
Rockie |
|
||||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 13 Всего: 31 |
jnb, на стеке тожде можно, если вытащить ссылку:
AlterMann, конструкторы базового класса нужно явно вызывать в потомках, вот, сделал пример:
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||||
|
|||||||
jnb |
|
||||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 4.10.2006 Репутация: 1 Всего: 1 |
без сомнения можно и на стеке, но как мне показалось AlterMann жаловался именно на разрушение объекта: т.е. массив переживает объекты на которые ссылаются его элементы. |
||||
|
|||||
AlterMann |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
Спасибо большое! очень помогли...
Сильно загнался по поводу связных списков... и запутался... Таки распутали вы меня! Это сообщение отредактировал(а) AlterMann - 24.12.2006, 02:00 |
|||
|
||||
AlterMann |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
Скажите, а могу ли я прописать в потомке класса продукт
А затем в функции, где я добавляю элементы массива указателей, на свои разные продукты, использовать этот самый оператор? Если да, то как??? Если написать так:
то не катит, ругается следующим образом:
Подскажите пожалуйста, где я не прав. |
||||||
|
|||||||
jnb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 4.10.2006 Репутация: 1 Всего: 1 |
AlterMann напиши, что конкретно ты хочешь сделать: зачем к одному продукту прибавлять другой? Какого типа у тебя ProductList? Что должна выполнить по твоей задумке инструкция ProductList[i] += p;?
А то в моем понимании твой operator+= выполняет добавление к кефиру скажем батона или селедки... |
|||
|
||||
AlterMann |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
jnb, начну по порядку:
ProductList - у меня - массив указателей на объекты подпродуктов (наследников абстрактного класса Product). Вы же мне про этот массив и написали... (: При добавлении продукта проверяется, есть ли уже такой продукт:
(т.е. по идее мне ещё нужно переопределить оператор ==, вернее я его переопределил, но ситуация такая же как и с +=) И если продукт уже есть (по разным параметрам проверяет, типа дата производства, каллорийность), то просто прибавляем новый продукт к уже существующему... Это сообщение отредактировал(а) AlterMann - 24.12.2006, 22:30 |
|||
|
||||
AlterMann |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
Извините... спасибо... сделал уже...
Нужно ж обращаться по указателю
|
|||
|
||||
Rockie |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 13 Всего: 31 |
А зачем?.. Нельзя просто счетчик продуктов где-то завести? -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
jnb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 4.10.2006 Репутация: 1 Всего: 1 |
вот так тоже должно работать:
|
|||
|
||||
Правила форума "Центр помощи" | |
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |