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

StackOverflow https://stackoverflow.com//questions/20052288

Вопрос

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

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)
{
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top