Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > operator== в абстрактном классе


Автор: cupper 10.8.2011, 11:40
Загнал себя в угол.

Есть абстрактный класс
Код

class X
{
virtual bool equal(const X* p) = 0
};


есть наследник
Код

class Y : public X
{
virtual bool equal(const X*p)
{
//... ?
}

private:
     Z* impl_;
};



Классы Y и Z это чернорабочие, они юзают разные сторонние библиотеки, подключают разные хедеры.
А класс X это как бы такой чистый интерфейс (only стандартные заголовки).

И вот как мне вывернуться что бы в Y реализовать это самое сравнение, что то мне не особо понятно. Потому что там я имею только указатель на чистый интерфейс, которые не содержит НЕ нужных для сравнения данных, НЕ методов обращения к ним. Эти методы могут появиться только в Y. Но тогда мне надо делать down cast чего я не хочу делать.

Автор: bsa 10.8.2011, 13:00
значит тебе необходимо сделать виртуальные методы у X, которые позволят получить данные, необходимые для сравнивания. Иначе сделать без downcasting и/или typeinfo нельзя.

Автор: cupper 10.8.2011, 13:29
Цитата(bsa @ 10.8.2011,  13:00)
значит тебе необходимо сделать виртуальные методы у X, которые позволят получить данные, необходимые для сравнивания. Иначе сделать без downcasting и/или typeinfo нельзя.

так и пришлось, сделать метод для доступа к данным которые пользователю по сути и не нужны. Теперь это новая "фича".

Автор: bsa 10.8.2011, 13:42
сделай функцию защищенной, а оператор сравнения френдом.

Автор: mes 10.8.2011, 14:16
Иерархия стабильна ? т.е. Вам (разработчику) известны все наследники этого интерфейса или пользователю позволено наследоваться и расширять иеррархию ?

Добавлено через 5 минут и 53 секунды
если да то поиск по мультиметоды.. 

Автор: Earnest 10.8.2011, 17:10
А по-моему, тут не надо усложнять себе жизнь; dynamic_cast для таких случаев и нужен. Тем более, что здесь он весьма уместен: если аргумент equal имеет не тот тип (т.e. Y), то, очевидно, false.

Автор: spyswamp 12.8.2011, 09:49
Вот именно. Лишние функции и прочие извраты в X не нужны.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)