Я хотел бы реализовать несколько конструкторов для моего класса через перегрузку. Как я понимаю, способ сделать это идиоматически, следуя принципу DRY, заключается в использовании функции, называемой делегированием конструкторов. Я также видел мысли о том, чтобы везде использовать ссылочные параметры и избегать указателей любой ценой, потому что ссылки - это способ c ++ и т. Д.
Так вот, как я вижу, это можно реализовать с помощью указателей (что работает):
class B {};
class C {};
class A {
public:
A();
A(const B* b);
A(const B* b, const C* c);
private:
const B* b_;
const C* c_;
};
// These ctors short and concise, delegating work to last ctor
A::A() : A(nullptr, nullptr) {}
A::A(const B* b) : A(b, nullptr) {}
// This ctor contains code that deals with b or c being nullptr
// Ideally I only modify code in this ctor (DRY)
A::A(const B* b, const C* c) : b_(b), c_(c) {
//code
}
Следующее, очевидно , не работает:
class B {};
class C {};
class A {
public:
A();
A(const B& b);
A(const B& b, const C& c);
private:
const B& b_;
const C& c_;
};
A::A() : A(nullptr, nullptr) {}
A::A(const B& b) : A(b, nullptr) {}
A::A(const B& b, const C& c) : b_(b), c_(c) {
//code
}
Поэтому вопрос заключается в том, как реализовать делегирование конструкторов, следующих семантике впример указателя, но со ссылкой в качестве параметров конструктора.
(Полностью ли я здесь пропускаю точку? Может быть, даже пялиться на общую идею?)