2015-04-21 5 views
0

У меня возникли проблемы с использованием std::list. Я могу использовать его хорошо со списком «простого» типа данных или списка одного типа объектов.Список нескольких объектов C++

Я хочу создать список из трех различных типов объектов. Например, существуют три типа объектов: класс p1, класс p2, класс p3. И я хочу создать список, содержащий объекты этих трех.

class p1 { 
... 
}; 

class p2 { 
... 
}; 

class p3 { 
... 
}; 

int main() { 
    std::list<whatshouldiInserthere?> namelist; 
} 

Я уже пробовал с шаблоном, но никак не мог. Не могли бы вы привести пример исходного кода?

+4

Вы смешиваете * объекты * с * классами *. – juanchopanza

+2

Я бы сначала спросил * почему * вы хотите это сделать? Там может быть лучший способ. – Galik

+2

Как вы ожидаете использовать 'namelist'? Нет смысла создавать структуру данных, если вы не планируете использовать ее для чего-то, и если вы сообщите нам, как вы ее будете использовать, мы можем вам помочь. Расскажите, как вы поместите данные в «namelist» и, что более важно, как вы будете читать данные в «namelist». –

ответ

2

whatshouldiInserthere не существует. Вам нужно сохранить варианты (например, boost::variant, boost::any и т. Д.), Которые содержат экземпляры ваших классов.

+5

.... или эти три класса наследуют от одного базового класса и сохраняют указатели на это. –

9
  • Вы можете использовать список void *, отказавшись от элегантного и современного решения
  • Вы могли бы вместо того, чтобы вывести все свои объекты от базового класса, а затем сделать ваш список содержит указатели на этот базовый класс вместо
  • Вы можете использовать boost::variant или boost::any как своего рода сейф типа void *. На самом деле это намного лучше, чем кажется, потому что благодаря магии шаблона он не имеет дополнительных уровней косвенности и по-прежнему не требует того же базового класса
+1

Второй указатель - идеальный подход, когда ваша система требует объектно-ориентированного подхода. –

+1

Проблема с этим ответом заключается в том, что он дает маленькому ребенку выбор между пистолетом, ракетой и бензопилой, когда ребенок спрашивает: «Как я могу разобраться с монстром под кроватью?» То, что действительно нужно ребенку, - это стакан воды. (о, и вы забыли опцию gernade: type erasure) – Yakk

+0

@Yakk, это первый случай, назовите его 'void *', и все готово. Во всяком случае, я думаю, что вам немного не нравится, очень часто выводить типы из одного базового класса на большинстве языков ООП и использовать этот базовый тип в своих коллекциях. – Blindy

Смежные вопросы