Несколько типов объектов в STL List, C ++ - PullRequest
0 голосов
/ 07 февраля 2012

Итак, у меня есть этот тип наследования:

Class A { virtual intfB(){} ; virtual intfC(){}; };
Class B : public A { int fB(){}; };
Class C : public A { int fC(){}; };

Тогда у меня есть класс E, который использует список для хранения объектов B и C.

Class E 
{
public:
    insert(A* obj){ l.push_front(obj);}
    print(){ /* uses iterator i to cout the fB() and fC() of the objects in l */ };

private:
    list <A*> l;
}

Я устанавливаю различные функции объектов B и C как virtual в A, а затем использую итератор i для доступа к объектам l из функции print(). Моя проблема в том, что я не могу найти правильный способ вызова B::fB() и C::fC(), потому что итератор может указывать на объект C или B, поэтому я должен сделать что-то подобное для каждого объекта, который я не делаю Я думаю, это практично:

cout << (*i) -> fB();
cout << (*i) -> fC();

Так что в основном я вызываю fC и fB для каждого объекта независимо от его типа, и вызывается виртуальная функция базового класса, когда это не правильный вызываемый объект.

Это не может быть правильно, правда? Как еще я могу достичь этого?

Следует отметить, что я должен использовать композицию для классов E, C и B?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

Если intfB () и intfC () технически являются одной и той же функцией, но с разными реализациями для B и C, то вам нужно просто объявить одну виртуальную функцию в A (возможно, называемую intf) и предоставить необходимые реализации для обоихB и C.

Идея абстрактного класса состоит в том, чтобы определить базовую функциональность, которой поделятся более подробные реализации этого класса.Таким образом, с описанной выше схемой каждый объект, на который указывают элементы вашего списка, будет гарантированно иметь реализацию intf ().

Я не уверен, что ваш пример скомпилируется (я не проверял этохотя) потому что ни B, ни C не предоставляют реализации для виртуальных функций, объявленных в A.

0 голосов
/ 07 февраля 2012

Ты прав: не делай так. Если вы хотите напечатать элемент, вызовите функцию print в A и переопределите ее в обоих дочерних классах. Затем вы вызываете print для каждого элемента во время итерации, и каждый ребенок делает правильную вещь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...