powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / ссылки в сырых экземплярах класса
8 сообщений из 8, страница 1 из 1
ссылки в сырых экземплярах класса
    #39779088
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
натолкнулся на такую проблему и загрустил

MS VS 2013
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class CParam	// data holder
{
public:
	const int& Data = data_;
private:
	int data_ = 0;
};
//---------
class CSerializer // serializer
{
public:
	const CParam& Param = param_;
private:
	CParam param_;
};
//---------
class CUse
{
public:
	const int& Data = ser_.Param.Data;
private:
	CSerializer ser_;	
}



В общих чертах: есть класс data holder, который работает с данными. Есть класс, который эти данные сериализует.
Вчера сделал класс (типа CUse) у которого стописят таких настроек. Чтобы не плодить код, решил завести параметры (типа CSerializer ser_), а наружу выкинуть ссылки на сами данные(типа const int& Data = ser_.Param.Data;). Быстро. Удобно. Лаконично.

Но не работает даже если делать инициализацию ссылки в конструкторе.
Почему не работает: ser_ при создании объекта заполняется 0xcdcdcdcd, после этого внутри по смещению берётся указатель на Param и c него делается смещение на Data, но Param на этот момент тоже 0xcdcdcdcd, что приводит к AV.
Можно как-то эту проблему обойти?
...
Рейтинг: 0 / 0
ссылки в сырых экземплярах класса
    #39779091
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нормальный компилятор тебе сообщит что поле ser_ будет проинициализировано после поля Data.
...
Рейтинг: 0 / 0
ссылки в сырых экземплярах класса
    #39779092
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторБыстро. Удобно. Лаконично.
и дополнительный указатель в памяти с каждой ссылкой. переход скорее всего компилятор соптимизирует, но память будет обязан выделить.

а геттер полностью бесплатный :)
...
Рейтинг: 0 / 0
ссылки в сырых экземплярах класса
    #39779117
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kа геттер полностью бесплатный :)Геттер - функция, нужно ещё писать пару скобок. А так же в дебаге:

Код: plaintext
1.
2.
3.
value = ser_.Data;
// vs
value = ser_.DataGet();



в первом случае я сразу могу посмотреть значение. Во втором мне надо будет или провалиться, или лезть внутрь ser_. Тут, конечно, можно посмотреть и value, но иногда правая часть просто передаётся в функцию.

alex_kи дополнительный указатель в памяти с каждой ссылкой.Ну, было бы классно, если можно было бы делать фиктивные ссылки, которые не ссылки, а сами объекты, но read-only . Ведь на самом деле, private и protected проверяются только на уровне компилятора.
...
Рейтинг: 0 / 0
ссылки в сырых экземплярах класса
    #39779207
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb
Код: plaintext
1.
const int& Data = ser_.Param.Data;


Это не будет работать если объект копируется.
Ссылки будут указывать на старые копии.
...
Рейтинг: 0 / 0
ссылки в сырых экземплярах класса
    #39779388
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbМожно как-то эту проблему обойти?С++ инициализирует данные-члены в порядке их объявления в классе. Местами данные и ссылки поменяй и будет тебе щастье)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class CParam	// data holder
{
private:
	int data_ = 0;
public:
	const int& Data = data_;
};
//---------
class CSerializer // serializer
{
private:
	CParam param_;
public:
	const CParam& Param = param_;
};
//---------
class CUse
{
private:
	CSerializer ser_;	
public:
	const int& Data = ser_.Param.Data;
};
...
Рейтинг: 0 / 0
ссылки в сырых экземплярах класса
    #39781283
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyCEMb
Код: plaintext
1.
const int& Data = ser_.Param.Data;


Это не будет работать если объект копируется.
Ссылки будут указывать на старые копии.

Объект со ссылками автоматом не копируется.
...
Рейтинг: 0 / 0
ссылки в сырых экземплярах класса
    #39781285
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivОбъект со ссылками автоматом не копируется.
Еще как копируется.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / ссылки в сырых экземплярах класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]