C ++: проблемы при создании дочернего класса в родительском классе

0

Я работаю над проектом, который включает класс A, содержащий несколько дочерних классов (childB, childC, childD). Моя слишком упрощенная цель состояла в том, чтобы иметь что-то вроде этого

#include <string>

class A{
public:
   childB cb;                       <<Error C4430: missing type specifier - int assumed
   childC cc;                       <<Error C4430:    "                            "
   childD cd;                       <<Error C4430:    "                            "

   A(){
      cc.setString("xyz");          <<Error C2039: 'cc' is not a member of A
   }
};

class childB : public A{
public:
   int value;
};

class childC : public A{
private:
   std::string str;
public:       
   void setString(std::string s){
      str = s;
   }
   std::string getString(std::string s){
      return str;
   }
};

class childD : public childB{
public:
   double value;
};

#include "classA.h"

int main (){
   A a;
   a.cc.getString();               <<Error C2228: left of '.getString()' must have class/struct/union
}

С этого момента у меня было бы несколько вещей в основном, которые задавали бы значения разных дочерних классов, но при компиляции я получаю многочисленные ошибки, говорящие мне, что cb, cc, cd не являются членами A. Дополнительные ошибки также перечислены.

Есть ли причина, по которой я не смог бы добавить дочерний класс в родительский класс, как показано?

  • 2
    С одной стороны, поскольку childB является подклассом A а A имеет переменную-член типа childB , childB также должен будет иметь переменную-член типа childB , которая будет иметь другую переменную-член ... Почему вы думаете, что A должен содержать экземпляры своих собственных подклассов?
  • 0
    Я составлял связанный список A * и хотел и простой способ иметь все три типа дочерних классов доступными, чтобы я мог переключаться между ними в любой момент. Это будет основано на проверочной строке, которую я передам классу.
Показать ещё 6 комментариев
Теги:
c++11

1 ответ

0

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

Определите дочерние классы в отдельных файлах заголовков.

Добавить декларации дочерних классов в заголовочный файл родительского класса.

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

Инициализируйте дочерние классы указателей класса родительского класса с соответствующими дочерними объектами класса в родительском методе, таком как init(). Не инициализируйте их в родительском конструкторе, так как он сделает бесконечную рекурсию. Вам нужно будет перенести метод init() в файл cpp и включить в него файлы заголовков дочерних классов.

  • 0
    Если предположить, что вы хотите вызывать new для дочерних классов в базовом классе ctor, это само по себе не поможет, поскольку у вас будет бесконечная рекурсия.
  • 0
    Спасибо @kec за указание на это. Я обновлю ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню