2011-03-31 2 views
0

Я хотел бы получить вектор/список указателей производных классов (один из которых соответствует каждому производному классу из абстрактного базового класса), учитывая имя базового класса, например.Как заполнить вектор/список всеми производными классами базового класса

+2

Вы хотите получить вектор производных указателей от * what input *? – Jon

+0

Этот вопрос не отвечает в данной форме. –

+0

Вы спрашиваете, с учетом объекта, список указателей на различные уровни вывода класса этого объекта? то есть. Foo *, DerivedFoo *, MoreDerivedFoo *. Обратите внимание, что все эти указатели будут иметь одинаковое значение. –

ответ

1

Так делать именно то, что вам кажется, хочет сделать

#include <list> 

class BaseObject { }; 

class Dinosaur : public BaseObject { }; 

class Hammer : public BaseObject { }; 

void 
myFunction() { 
    std::list<BaseObject*> myList; 
    myList.push_back(new Dinosaur()); 
    myList.push_back(new Hammer()); 
} 

Обратите внимание, что объекты в списке не бесплатно сами по себе, когда список будет уничтожен. Либо вы должны делать вручную (Перебор списка и вызова удалить), либо смотреть на что-то немного сложным, если вы C++ новичок, auto_ptr и волшебный мир умных указателей ^^

+0

Спасибо за ответ. Да, это действительно очевидное решение, но я надеялся, что есть способ избежать необходимости заполнить список сам, используя некоторые функции времени выполнения компилятора C++, возможно? –

+0

@ user545591: такой функции нет. –

+0

Философия C++ заключается в том, чтобы делать наименее возможные вещи за сценой во время выполнения! Более динамичным, за-сценой-временем исполнения-магии может быть Objective C. Или если вы хотите в полной мере действовать в этом направлении, Python, Ruby, Lisp ... – Monkey

1

Вы не можете получить указатель на класс. Класс - это просто спецификация объекта. У вас есть только что указать, как только объект создается, создавая экземпляр класса.

Если у вас есть следующие классы:

class FooBase {}; 
class DerivedFoo : public FooBase {}; 
class MoreDerivedFoo : public DerivedFoo {}; 

вы можете создать объект типа MoreDerivedFoo и указывают на него, используя указатель любого из этих типов.

MoreDerivedFoo mdf = new MoreDerivedFoo(); 
FooBase* p1 = &mdf; 
DerivedFoo* p2 = &mdf; 
MoreDerivedFoo* p3 = &mdf; 

Очевидно, что каждый из этих указателей будет содержать тот же адрес памяти.

+0

@Cooper: Не совсем то, на что я надеялся. Но из ответов ниже я понял, что это не так тривиально. Поэтому, пожалуйста, игнорируйте пока. –

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