Как запустить неконстантные методы для вложенных объектов в шаблоне Composition / Aggregation в C ++? - PullRequest
0 голосов
/ 27 декабря 2018

Я пришел из мира C # и, благодаря «Свойствам», я могу запустить метод установки для вложенного объекта, не пропуская какие-либо внутренние компоненты, подобные этому:

objectA.objectB.objectC.SetSomething();

Пока я нашелчто лучшим аналогом в C ++ является использование геттеров и получение вложенных объектов по значению или константной ссылке, чем использование сеттеров для установки их по значению.Но это привело бы к следующему коду:

auto b = objectA().getObjectB();
auto c = b.getObjectC();
c.SetSomething();
b.setObjectC(c);
objectA.setObjectB(b);

Мало того, что это 5 строк вместо одной, но это включает в себя несколько копий вложенных объектов в b.setObjectC(c); и objectA.setObjectB(b);

Я могу позволить получателям возвращать неконстантную ссылку на вложенный объект (или использовать публичные переменные) и иметь возможность писать на C ++:

objectA.objectB.objectC.SetSomething();

Но, мгновенно, я получаювозможность установить objectB без objectA знание, подобное этому:

objectA.objectB = b {};

И это недопустимо в схеме агрегации, где родительский объект инициализирует вложенный объект.

Два других подхода, о которых я читал:

  • Вместо агрегирования используйте несколько защищенных наследований и переводите необходимые методы с помощью «using».Однако я также прочитал в «Руководстве по стилю Google C ++», чтобы никогда не использовать защищенное наследование.

  • Переписать все необходимые методы в родительском классе вручную.Но это
    потребовало бы от меня написания метода SetSomething () в обоих ObjectB
    и objectA , что, на мой взгляд, нарушает "Не повторяйте
    самостоятельно".

Чего мне не хватает?Как это может быть сделано?Может ли кто-нибудь, пожалуйста, пролить свет.

Спасибо заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...