Задать вопрос

Переопределить operator() для получения доступа к члену класса?

Допустим у меня есть такой класс (все лишнее убрал для наглядности):
class Window{
public:
	Graphics *g;
}

Например я где-то создаю Window myWindow(); Для того, чтобы вызвать функцию объекта g мне нудно написатьmyWindow.g-> и только потом писать нужную функцию.
Это плохо как минимум тем, что мой g можно спокойно изменить снаружи класса. Но и сделать его закрытым не очень хорошая идея, потому что тогда придется писать некую прослойку для вызова каждой функции, а их под сотню, да еще и все с перегрузками. И я подумал: а нельзя ли как-то хитро переопределить operator() так, чтобы вот эти строки были эквивалентны:
myWindow.g->Clear(Color::White);
myWindow(Clear(Color::White));

То есть грубо говоря пробросить методы объекта g в свой класс. Это вообще реально? Ну или хотя бы что-то похожее, чтоб код был более защищенным и компактным.
  • Вопрос задан
  • 133 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@res2001
Developer, ex-admin
Может вас устроит наследование вашего Window от Graphics?
Эффект от наследования точно такой какой вы хотите получить другими способами.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
class Window{
public:
  Graphics& operator * () const { return *g; }
  Graphics* operator -> () const { return g; }
private:
  Graphics *g;
}

...

window->Clear(Color::White);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы