Как создать объект подкласса в базовом классе - PullRequest
0 голосов
/ 02 декабря 2018

я пытаюсь сделать следующее:

  • Иметь объект класса Sub в классе Base.
  • Сделать Sub доступ к классу Base класс 'Переменные es

Base.h

#include "Sub.h"
class Base
{

Sub subobject
int x;
}

Sub.h

#include Base // to acces x from .cpp file
class Sub: public Base
{
void changevar();
}

Sub.cpp

#include "Sub.h"
// I tried to include base in here but that did not work either
void Sub::changevar()
{
x++;
}

Но я продолжаюполучение неопределенного базового класса и неопределенной необъявленной x ошибки.Как я могу решить это?

1 Ответ

0 голосов
/ 02 декабря 2018

Что если вместо этого вы сохраните подобъект в качестве указателя?

Вам также потребуется

  • Переслать объявление вашего подкласса в Base.h перед вашим базовым классом
  • Включите Sub.h в ваш файл Base.cpp.
  • Вызовите new, чтобы у него было что-то, указывающее на него, и, очевидно, соответствующее удаление (примечание: не в конструкторе, поскольку это создаст цикл, в которомBase создает Sub, который создает Base, который создает Sub)

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

Также обратите внимание, что Sub будет иметь свою собственную Base как часть его, поэтому базовая часть подобъекта не будет такой же, как внешняяBase.

например, если бы в самой Base было целое число с именем Y, то у нас был бы Y Base, но также отдельный Y для подобъекта.

Может быть, лучше объяснить, почему базовый классНебраскаскопировать копию подкласса?

Примерный набросок кода:

Base.h

#include "Base.h"

class Sub;

class Base
{
public:
    Sub* subobject;
    Base();
    ~Base();

    void createSub();
};

Base.cpp

#include "Base.h"
#include "Sub.h"

Base::Base()
{
    subobject = new Sub();
}

Base::~Base()
{
    delete subobject;
}

void Base::createSub()
{
    if (subobject)
        return;

    subobject = new Sub();
}

Sub.h

#include "Base.h"

class Sub : public Base
{
    void changevar();
    int x = 0;
};

Sub.cpp

void Sub::changevar()
{
    x++;
}
...