Хорошо: вот моя проблема: у меня есть базовый составной класс, который принимает посетителя, а затем перебирает его узлы. Работает как шарм. Но затем я должен использовать производный от этого композита и признать, что мне нужно переопределить метод «accept()» в производном классе, чтобы иметь правильную двойную диспетчеризацию (чего я не понял).
Это выявляет два недостатка: во-первых, мне приходится ломать скрытую структуру базы, а во-вторых, мне приходится дублировать код. Чтобы прояснить, вот мой псевдокод:
struct Visitor
{
void visit( BaseComposit*) { throw( "not expected"); };
void visit( DerivedComposit*) { throw( "ok"); };
};
class BaseComposit
{
private:
std::vector< BaseComposit*> nodes;
public:
virtual void accept( Visitor* v)
{
v->visit( this);
for( int i = 0; i < nodes.size(); i++)
nodes[ i]->accept( v);
}
};
class DerivedComposit : public BaseComposit
{
public:
};
Любое элегантное решение по этому поводу? Спасибо !
Изменить: добавлено «виртуальное» в «принять ()», чтобы сделать его более точным...
( point)( is)( that)( this)
стиль может вызвать много дискуссий при ревью кода. Поверьте мне, одно пространство может выделяться не меньше, чем многие другие. - person StoryTeller - Unslander Monica   schedule 07.12.2017( this )
или(this)
, но боюсь, что( this)
всегда будет проблемой для меня при проверке кода. Но YMMV :) - person StoryTeller - Unslander Monica   schedule 07.12.2017