Я пришел из мира 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 , что, на мой взгляд, нарушает "Не повторяйте
самостоятельно".
Чего мне не хватает?Как это может быть сделано?Может ли кто-нибудь, пожалуйста, пролить свет.
Спасибо заранее.