Паттерн Visitor и правила ООП

Пусть есть класс:

class A
{
private:
    int x;
    ...
};

И некоторый контейнер Container<A> с методом Container<A>::accept<VisitorT>(const VisitorT visitor)

Пусть есть конкретный visitor, в котором нужно установить поля класса A.

void concrete_visitor(A& a)
{
   a.x = 1;
}

Но поле x приватное. Если сделать его публичным, то это будет нарушением ООП? Если с точки зрения книги Object Thinking сеттеры и геттеры - тоже нарушение инкапсуляции.

Как правильно согласовать такое поведение не нарушив принципов ООП? При этом не используя friend, ведь посетителем может быть лямбда и их может быть большое количество.


Ответы (1 шт):

Автор решения: Вадим Александру

Паттерн Посетитель (Visitor) позволяет определить операцию для объектов других классов без изменения этих классов.

→ Ссылка