powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Переменная-член класса, недоступная только на запись
12 сообщений из 12, страница 1 из 1
Переменная-член класса, недоступная только на запись
    #32523971
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если объявить переменную в классе protected, то её будет нельзя ни читать, ни писать снаружи класса (подробности не в счёт).

В программе уже есть около ста обращений к переменной, и среди них только десятка два присвоений. Мне как раз присвоения надо отследить.

Но если я объявлю её protected, то мне придётся вносить изменения в ста местах :( Нет ли в C++ способа это обойти?
...
Рейтинг: 0 / 0
Переменная-член класса, недоступная только на запись
    #32524154
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
class prop
{
public:
	prop(): var_int( 3 ), public_var(var_int), protected_var(var_int)
	{}
public:
	const int &public_var;
protected:
	int &protected_var;
private:
	int var_int;
};

void main(void)
{
	prop the_prop;
//	the_prop.public_var =  10 ;
//	the_prop.protected_var =  20 ;
	cout << the_prop.public_var << endl;
}
PS> Не могу не воспользоваться случаем и напомнить - поля класса должны всегда быть private :)
...
Рейтинг: 0 / 0
Переменная-член класса, недоступная только на запись
    #32524572
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял.
Какую из этих переменных можно изменить функцией класса, но нельзя снаружи?
...
Рейтинг: 0 / 0
Переменная-член класса, недоступная только на запись
    #32524660
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class X {
  public:
    X():A( 0 ){B = const_cast<int*>(&A);}
  private:
    int *B;
    void f(int Y){*B = Y;}
  public:
    const int A;
};
...
Рейтинг: 0 / 0
Переменная-член класса, недоступная только на запись
    #32524835
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZrenBy
Смешно :)

f, наверно, public?
...
Рейтинг: 0 / 0
Переменная-член класса, недоступная только на запись
    #32524905
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это было, на мой взгляд, самое простое и элегантное решение...

Можно еще так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
class property_owner;
class derived_owner;
template <class T>
class property
{
public:
	property(){};
	property(T newT): prop_value(newT){}

	operator T () const
	{return prop_value;}

protected:
	property &operator=(const T newT)
	{prop_value=newT; return (*this);}
	
	friend property_owner;
	friend derived_owner;
private:
	T prop_value;
};
class property_owner
{
public:
	property<int> val;
};
class derived_owner: public property_owner
{
public:
	derived_owner()
	{val =  30 ;}

};
void main(void)
{
	property_owner the_owner;

	cout << the_owner.val << endl;

	derived_owner the_owner2;

	cout << the_owner2.val << endl;
}
...
Рейтинг: 0 / 0
Переменная-член класса, недоступная только на запись
    #32525408
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а так:

Код: plaintext
__declspec( property( get=get_func_name ) ) declarator

?
...
Рейтинг: 0 / 0
Переменная-член класса, недоступная только на запись
    #32525617
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuri
Ты не ответил на мой вопрос.
Какую из этих переменных можно изменить функцией класса, но нельзя снаружи?
...
Рейтинг: 0 / 0
Переменная-член класса, недоступная только на запись
    #32525682
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой Вэй

Первый способ позволяет открыть переменную под одним именем для чтения, а под другим для записи. Хоть это и не на 100% то что нужно тебе, но как ты сам сказал
В программе уже есть около ста обращений к переменной, и среди них только десятка два присвоений. Мне как раз присвоения надо отследить.
Так вот - все присвоения на этапе компиляции тебе покажет компилятор :)

Второй способ использует парадигму свойства на C++ видоизмененную для твоего случая. Он на 100% удовлетворяет твоим требованиям и несколько неудобен так как требует перечисления всех классов-клиентов как friend . Но, опять же, нужно ли это - ведь если задача стоит отследить присваивания - но достаточно в friend'ы записать только базовый класс владелец свойства (это позволит ему самому менять свойство в своих методах) - а все присваивания из вне будут указаны компилятором...
...
Рейтинг: 0 / 0
Переменная-член класса, недоступная только на запись
    #32525695
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb

Как безнадежно я устарел, со своими шаблонами! MS C++ Specific forever...
...
Рейтинг: 0 / 0
Переменная-член класса, недоступная только на запись
    #32526653
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 funikovyuri

Не переживай, я сам тока недавно обновился :)
...
Рейтинг: 0 / 0
Переменная-член класса, недоступная только на запись
    #32527962
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuri
Ага, теперь понятно.

Спасибо всем.

На текущий момент решение оказалось ещё проще -- расставить двадцать остановов :)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Переменная-член класса, недоступная только на запись
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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