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

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

Но если я объявлю её protected, то мне придётся вносить изменения в ста местах :( Нет ли в C++ способа это обойти?
...
Рейтинг: 0 / 0
19.05.2004, 15:12
    #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
19.05.2004, 17:35
    #32524572
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная-член класса, недоступная только на запись
Не понял.
Какую из этих переменных можно изменить функцией класса, но нельзя снаружи?
...
Рейтинг: 0 / 0
19.05.2004, 18:06
    #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
19.05.2004, 19:52
    #32524835
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная-член класса, недоступная только на запись
ZrenBy
Смешно :)

f, наверно, public?
...
Рейтинг: 0 / 0
19.05.2004, 21:24
    #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
20.05.2004, 10:45
    #32525408
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная-член класса, недоступная только на запись
а так:

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

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

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

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

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

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

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

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


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