C++ - Накарайте тип да може да държи своите деца

Имам свързан списък от тип Устройство:

Node<Device> list = new Node<device>(device);

И устройството има извлечени класове:

въведете описание на изображението тук

И имам нужда от моя списък, за да мога да побера всеки производен клас устройство.

Как мога да го направя?

Забележка: Ако изпратя Aerobic_Device към списъка, то просто динамично се преобразува в Device, което губи данни.

РЕДАКТИРАНЕ:

Промених цялата логика на моята програма да работи с указатели и сега списъкът е: Node<Device*> - Което все още преобразува всичко в тип устройство. Сега, както мнозина предложиха, го превключих на Node<std::unique_ptr<Device>>, но това просто въведе много, много много грешки.


person Amit    schedule 28.12.2015    source източник
comment
Публикувайте съдържание на клас/структура Устройство/устройство.   -  person Richard Dally    schedule 28.12.2015
comment
Изглежда, че искате някои интелигентни указатели.   -  person Basile Starynkevitch    schedule 28.12.2015
comment
Имате нужда от списък с указатели. Ако това не е домашно, моля, използвайте стандартен контейнер.   -  person n. 1.8e9-where's-my-share m.    schedule 28.12.2015
comment
Можете да съхранявате ID за всеки тип и да дефинирате в Device: int getType(); за да получите този идентификатор.   -  person Pierre Emmanuel Lallemant    schedule 28.12.2015
comment
Мисля, че проблемът ви е в две неща: 1. Трябва да съхраните указател към Device в списъка. 2. Ще ви трябва общ интерфейс [или използвайте dynamic_cast] с помощта на виртуални функции.   -  person Mats Petersson    schedule 28.12.2015
comment
Този въпрос вече е приключен. Ако имате въпрос относно съхраняването на необработени указатели или unique_ptrs в списък, задайте нов въпрос. Препоръчвам ви да направите това, защото вашите забележки показват, че вашето разбиране за полиморфизма в C++ липсва.   -  person n. 1.8e9-where's-my-share m.    schedule 28.12.2015


Отговори (2)


Направете списъка да бъде от тип Device* (обърнете внимание на показалеца).

Node<Device*> list;

След това декларирайте обекти от производни типове (PowerDevice, AerobicDevice, PowerAerobicDevice) и ги поставете в списъка.

По този начин можете да използвате силата на полиморфизма по време на изпълнение.

Като алтернатива можете (и трябва) да използвате интелигентни указатели вместо необработени указатели за автоматично боравене с паметта:

std::unique_ptr<Device> pDevice= std::make_unique<PowerDevice>(...);
// put into list
std::unique_ptr<Device> aDevice= std::make_unique<AerobicDevice>(...);
// put into list
std::unique_ptr<Device> paDevice= std::make_unique<PowerAerobicDevice>(...);
// put into list
person CinCout    schedule 28.12.2015
comment
Това не отговаря на него. Това, което той иска, е да идентифицира кой подклас се използва, да ги преобразува, за да извлече атрибутите. Той вече прави това, което казвате. - person Pierre Emmanuel Lallemant; 28.12.2015
comment
@PierreEmmanuelLallemant Можете ли да прочетете кода на OP? Защото не виждам това във въпроса. - person juanchopanza; 28.12.2015
comment
juanchopanza: Прочетете отново въпроса. - person Pierre Emmanuel Lallemant; 28.12.2015

Не можете да съхранявате вашите обекти по стойност и да имате полиморфно поведение едновременно. Можете да съхранявате вашите обекти чрез (за предпочитане интелигентен) показалец:

Node<std::unique_ptr<Device>> list;
person el.pescado    schedule 28.12.2015
comment
Добре, защо не просто обикновени указатели? - person Amit; 28.12.2015
comment
@Amit Тъй като интелигентните указатели ще направят управлението на паметта вместо вас и това е, което трябва да използвате. - person Angew is no longer proud of SO; 28.12.2015
comment
Можете да използвате обикновен указател, тъй като няма мулти наследяване. - person Pierre Emmanuel Lallemant; 28.12.2015
comment
@Amit Ако някой друг притежава обектите, добре е да използвате обикновени указатели. Но ако списъкът ги притежава или споделя собствеността, тогава имате нужда от интелигентен указател, който изразява този модел на собственост. - person juanchopanza; 28.12.2015