Использование ссылок для доступа к объектам класса C ++
476 просмотра
1 ответ
Это меня поставило в тупик. То, что я пытаюсь сделать, - это получить ссылочную переменную в классе-обертке, чтобы она указывала на объект структуры в классе, который она оборачивает, так что любые установки переменных в структуре из других классов, которые используют класс-обертку, фактически устанавливаются в обернутый класс не класс обертки. Для этого я попытался просто создать ссылку в классе обертки на структуру в обернутом классе, например
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 Источник Размещён: 13.11.2019 11:46Ответы (1)
2 плюса
Это где ты ошибся
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
Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- c++ В C ++ конструктор и деструктор могут быть встроенными функциями?
- inheritance Предпочитаете композицию наследству?
- inheritance Вызывать события C # извне класса-владельца?
- inheritance Хорошие причины запретить наследование в Java?
- inheritance Что «супер» делает в Python?
- inheritance Наследование Python - как отключить функцию
- reference Каковы различия между переменной-указателем и ссылочной переменной в C ++?
- reference Есть ли разница между "==" и "есть"?
- reference Определение манифеста обнаруженной сборки не соответствует ссылке на сборку
- reference Есть ли ошибки, использующие varargs с опорными параметрами
- reference Рекомендации для хорошего справочника vi?
- addressing Использование ссылок для доступа к объектам класса C ++
- addressing Сохранить слово в 32-битной сборке MIPS
- addressing Как обратиться к просмотру пакета на Laravel 5.1
- addressing Какое минимальное количество режимов адресации необходимо для вычислений?
- addressing C# foreaching through list<struct> won't change values