Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: cannot convert 'this' pointer from 'const CLayerEngine' to 'CLayerEngine &'  (Прочитано 8056 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 14-05-2005 03:51 » 

Описал функцию возврата указателя на класс CLayerEngine как const чтобы никто его повредить не смог

const CLayerEngine* COGraphEdit::GetLayerEngine(void)
{
return (CLayerEngine*)(&m_LayerEngine);
}

А при попытке вызова метода класса

GetLayerEngine()->AnyMethod();

происходит ошибка

cannot convert 'this' pointer from 'const CLayerEngine' to 'CLayerEngine &'

Что делать? Убрать const не хотелось бы Я хочу чтобы класс остался неизменным
можно сделать ((CLayerEngine*)GetLayerEngine())->AnyMethod();

Работает, но гарантирует ли эта запись сохранность класса?
« Последнее редактирование: 17-12-2007 17:38 от Алексей1153++ » Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Alf
Гость
« Ответ #1 : 14-05-2005 08:07 » 

Когда мне нужно гарантировать, чтобы клиент не мог изменить состояние класса, я обычно делаю следующее.

1. Описываю клиентский интерфейс, т.е. класс, состоящий из чисто виртуальных функций. Каждая из этих функций гарантированно оставляет состояние класса неизменным.

2. Делаю свой класс производным от интерфейса.

3. Передаю клиенту ссылку на интерфейс класса, а не на сам класс.

Такой подход полностью изолирует клиента от всех членов класса, которые могут изменить состояние класса.
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #2 : 14-05-2005 09:11 » 

Альф в принципе интерфейс у меня тоже описан
Пользователь может вызывать только функции public все опасные функции protected и private в том числе и данные Хотелось просто перестраховаться видимо не получится так сделать как я хотел?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Alf
Гость
« Ответ #3 : 14-05-2005 10:05 » 

Альф в принципе интерфейс у меня тоже описан

Однако в примере этого не видно. Функция GetLayerEngine возвращает указатель на класс CLayerEngine, а не на интерфейс. Поэтому проку от наличия интерфейса немного.

Пользователь может вызывать только функции public все опасные функции protected и private в том числе и данные Хотелось просто перестраховаться

Так это для любого класса справедливо. Только при этом получается, что после создания класса ты и сам не сможешь изменить его состояние. Иногда это хорошо, а иногда и не очень. Лучше все же разделить интерфейсы на интерфейс доступа к данным только на чтение (общедоступный) и интерфейс изменения состояния класса. Клиенту, который должен лишь читать состояние, передавать лишь ссылку на первый.

видимо не получится так сделать как я хотел?

Можно попробовать еще описать твой метод как

Код:
void AnyMethod(void) const;

Возможно, в этом случае сработает твой первый вариант (со ссылкой на константный класс).

P.S. И лучше все-таки не применять преобразование типов в стиле C (вроде (CLayerEngine*)(&m_LayerEngine)). Лучше применять стиль C++, он гораздо более предсказуем.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines