Использование ссылок для доступа к объектам класса C++
-
26-12-2019 - |
Вопрос
Это меня поставило в тупик.Я пытаюсь получить ссылочную переменную в классе-оболочке, чтобы она указывала на объект структуры в классе, который он обертывает, чтобы любые настройки переменных в структуре из других классов, использующих класс-оболочку, фактически были установлены в завернутый класс, а не класс-оболочка.Для этого я попытался просто создать ссылку в классе-обертке на структуру в обернутом классе, например
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
так что 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 должна быть инициализирована в списке инициализаторов базы/члена конструктора и т. д.
Если окажется, что я пытаюсь сделать что-то, что мне совершенно ясно, как это сделать, это определенно так!Любая помощь приветствуется.
Решение
Вот здесь ты ошибся
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)
{
}