наследование — Использование ссылок для доступа к объектам класса Stack Overflow

Это меня поставило в тупик. Я пытаюсь получить ссылочную переменную в классе-обертке для указания на объект структуры в классе, который она оборачивает, так что любые установки переменных в структуре из других классов, использующих класс-обертку, фактически устанавливаются в обернутый класс не класс обертки. Для этого я попытался просто создать ссылку в классе обертки на структуру в обернутом классе, например

class CClassWrap
{
CClass::plot_type& PlotArgs;
}

а затем инициализировать PlotArgs

CClassWrap::InitWrap( CClass AppIfx )
{
PlotArgs = AppIfx.PlotArgs;
}

Я просто хочу, чтобы PlotArgs указывал на упакованный класс ‘PlotArgs, чтобы при доступе к PlotArgs из

class StudiesBase:public CClassWrap
{
//12 should show up in CClass because PlotArgs in CClassWrap points to the PlotArgs on CClass.
PlotArgs.value = 12;

}

12 отображается в версии PlotArgs с классами оберток. Для этого я попытался установить ссылку, определенную в файле .h, следующим образом

#include "CClass.h"
class CClassWrap
{
//PlotArgs is a struct with a few vars in it (int, long, etc.) that exists in CClass
CClass::plot_type& PlotArgs;
}

CClassWrap наследуется в другом классе, назовите его StudiesBase

class StudiesBase:: public CClassWrap
{
etc...
}

Когда это скомпилировано, выдается сообщение о том, что для CClassWrap не существует ctor по умолчанию. Поэтому я добавляю Ctor

такой, что CClassWrap теперь выглядит

class CClassWrap
{
public:
CClassWrap();
public:
//PlotArgs is a struct with a few vars in it (int, long, etc.) that exists in CClass
CClass::plot_type& PlotArgs;
}

Это приводит к ошибке C2758 о том, что PlotArgs не инициализируется.

Поэтому в ctor для ClassWrap я пытаюсь его инициализировать.

PlotArgs = AppIfx.PlotArgs;

где AppIfx устанавливается во время выполнения как указатель на объект CClass. Компилятору это не нравится, либо с ошибкой C2758 переменная должна быть инициализирована в базе конструкторов / списке инициализаторов элементов и т. Д.

Если окажется, что я пытаюсь сделать что-то, что мне совершенно ясно, как это сделать, то это определенно так! Любая помощь приветствуется.

0

Решение

Это где ты ошибся

CClassWrap::InitWrap( CClass AppIfx )
{
PlotArgs = AppIfx.PlotArgs;
}

Вы не можете перепривязать ссылку. Как только ссылка ссылается на что-то, она никогда не может быть сделана для ссылки на что-то еще. Этот код (если вы его выполнили) назначит AppIfx.PlotArgs к чему угодно PlotArgs упомянуто, это явно не то, что вы намеревались.

Вы должны переместить этот код в конструктор

CClassWrap::CClassWrap( CClass AppIfx ) : PlotArgs(AppIfx.PlotArgs)
{
}

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

CClassWrap::CClassWrap( CClass& AppIfx ) : PlotArgs(AppIfx.PlotArgs)
{
}
2

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector