Я все еще изучаю основы C++, но сейчас я работаю над проектом с использованием производных классов и виртуальных методов. Так что ситуация: У меня есть CLASSAПередача указателя на один производный класс другому
class ClassA
{
public:
virtual void action();
};
И есть две производные классы B и C:
#include "ClassA.h"
class ClassB: public ClassA
{
public:
virtual void action();
int valueB;
};
-
#include "ClassA.h"
class ClassC: public ClassA
{
public:
virtual void action();
int valueC;
};
Я хочу передать указатель на объект ClassB как параметр action() в ClassC, поэтому я могу сделать что-то вроде этого:
void ClassC::action(ClassB * ptr)
{
cout << "The value is: " << ptr->valueB;
}
Однако я не могу найти рабочий способ для этого. Все указатели объектов хранятся в
vector<ClassA *> objects
где
objects[0]=new ClassC();
objects[1]=new ClassB();
если я пытаюсь что-то вроде
objects[0]->action(object[1])
тогда мне нужен мой виртуальный метод в ClassA иметь параметр ClassB * , А затем для программы, чтобы распознать тип, который я попробовал, либо включая весь класс Class.h (плохая идея, он создает «цикл» включений или что-то еще) или с использованием класса декларации Forward Class Class Class; (Я получаю сообщение об ошибке недопустимого использования неполного типа). И поэтому я сейчас застрял. Я надеюсь, что все ясно, но я могу, конечно, предоставить больше данных, если это необходимо.
Право. потому что было бы небезопасно слепо опускать «A *» на «B *» –
, что бы избавиться от valueB и valueC и просто иметь значение int; в ClassA? – tetorea
Вы бы использовали декларацию класса ClassB в заголовке другого класса и include в cpp-файле. Вместе с Sentinel, как описано ниже, это позволит избежать цикла ... –