Производный экземпляр класса в базовом классе

Это код, который я пытаюсь понять. У него нет особого использования. Я просто пытаюсь понять, что происходит.

#include<iostream>
using namespace std;

class derivedClass;
class baseClass
{
public:
int objID;
derivedClass* dcObjPtr;

baseClass()
{
cout << "(1) Default constructor" << objID << endl;
}

baseClass(int ID)
{
objID = ID;
dcObjPtr = new derivedClass(1);
cout << "(2) Constructing base object with ID: " << objID << endl;
}
};

class derivedClass : public baseClass
{
public:
derivedClass()
{}

derivedClass(int ID) : baseClass(ID)
{
cout << "(4) Constructing derived object with ID: " << objID << endl;
}
};int main(int argc, char** argv)
{
derivedClass dcObj(1);

return 0;
}

Используя VS2013, я получаю ошибку «производный класс: класс не имеет конструкторов», что, на мой взгляд, не является правильной ошибкой.

Сначала я использовал экземпляр производного класса, а не указатель. И это дало мне странную ошибку насчет точки с запятой. Потом я увидел эта почта где принятый ответ должен был иметь указатель, а не экземпляр.

Вот вопросы, которые у меня есть:

  1. Почему компилятор жалуется на отсутствие конструкторов. Класс явно имеет конструкторы.
  2. Как это будет работать? Когда мы создаем экземпляр dervedClass, в нем есть часть baseClass. И у этой части baseClass есть производный класс, и так далее. Это рекурсивно. Я бы предположил, что если это работает, это приведет к ошибке сегментации или что-то в этом роде. Правильно ли я предположить, что это было бы рекурсивно (если это работает)?

Приветствия.

0

Решение

Вы используете определение derivedClass прежде чем он будет определен, позвонив new derivedClass в baseClass конструктор. Что вам нужно сделать, это переместить определение конструктора за пределы baseClass и после derivedClass, вот так:

#include<iostream>
using namespace std;

class derivedClass;
class baseClass
{
public:
int objID;
derivedClass* dcObjPtr;

baseClass()
{
cout << "(1) Default constructor" << objID << endl;
}

baseClass(int ID);

};

class derivedClass : public baseClass
{
public:
derivedClass()
{}

derivedClass(int ID) : baseClass(ID)
{
cout << "(4) Constructing derived object with ID: " << objID << endl;
}
};

baseClass::baseClass(int ID)
{
objID = ID;
dcObjPtr = new derivedClass(1);
cout << "(2) Constructing base object with ID: " << objID << endl;
}

int main(int argc, char** argv)
{
derivedClass dcObj(1);

return 0;
}
1

Другие решения


По вопросам рекламы [email protected]