Головоломка для извращенцев: классы, поля, методы...
Добавлено: 04 июл 2005, 08:54
Доброе время суток всем!
Вообщем, дружан подкинул мне такую задачку...
Представим, что у нас имеется класс:
Надеюсь, что затруднений особых он не вызовет.
Вот, каким образом мы обращаемся к переменной data? Через функции доступа - getData и setData, т.е. примерно так:
или так:
Товарищу моему такой вариант не слишком понравился... Говорит, что не наглядно и не слишком красиво... Хотелось бы видеть что-то вроде:
Ну, говорю, тогда помести переменную data в public:-секцию и не мучайся!..
Но тут возникает одно НО: нужен контроль за тем, что присваивается нашей переменной... Ну, если мы используем функцию доступа, то все просто:
Тут f - это функция, принимающая int и возвращающая bool, а в функции может быть записано какое-то условие, ну, например,
Разрешит изменение переменной data только в том случае, если мы захотим присвоить ей четное число; если число будет нечетным - то переменная меняться не должна.
Вопрос в том, как сделать это, чтобы синтаксис работы с классом был такой:
A a;
a.data=10; // переменная изменится и станет равной 10
a.data=-7; // переменная не изменится, и останется равной 10
???
Вообщем, дружан подкинул мне такую задачку...
Представим, что у нас имеется класс:
Код: Выделить всё
class A
{
private:
int data;
public:
A():data(0){};
int getData() {return data;}
void setData(int _data) {data=_data;}
}
Вот, каким образом мы обращаемся к переменной data? Через функции доступа - getData и setData, т.е. примерно так:
Код: Выделить всё
A x;
x.setData(2005);
cout<<x.getData();
Код: Выделить всё
A* y=new A;
y->setData(2005);
cout<<y->getData();
Код: Выделить всё
x.data=2005;
y->data=2005;
Но тут возникает одно НО: нужен контроль за тем, что присваивается нашей переменной... Ну, если мы используем функцию доступа, то все просто:
Код: Выделить всё
...
void setData(int _data)
{
if (f(_data)) data=_data;
}
...
Код: Выделить всё
bool f(int arg) {if (arg%2==0) return true; else return false;}
Вопрос в том, как сделать это, чтобы синтаксис работы с классом был такой:
A a;
a.data=10; // переменная изменится и станет равной 10
a.data=-7; // переменная не изменится, и останется равной 10
???