Вопрос:

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

c++ inheritance reference addressing

476 просмотра

1 ответ

35 Репутация автора

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

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 переменная должна быть инициализирована в базе конструкторов / списке инициализаторов элементов и т. Д ...

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

Автор: user2913447 Источник Размещён: 18.11.2013 04:06

Ответы (1)


2 плюса

44970 Репутация автора

Решение

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

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)
{
}
Автор: john Размещён: 18.11.2013 04:12
Вопросы из категории :
32x32