Я пытаюсь определить, какие шаблоны могут быть использованы для объявления класса C ++ более «композиционным» и менее «императивным» способом.
Я пытаюсь написать класс, который включает несколько MyDescriptor
членов. MyDescriptor
должен быть инициализирован конструктором классов MyHost
, и для этого он перебирает ссылки на члены MyHost
.
Есть ли способ объявить MyHost
реализации, которые не требуют добавления ссылок на члены класса в контейнер отдельно?
class MyDescriptor {
public:
string name;
string fqn;
MyHost(string n) : name(n) {}
void init(string host) {
fqn = host + ":" + name;
}
void do_thing() {
// subclasses to special things.
}
}
class MyHost {
public:
vector<MyDescriptor*> descriptors;
string name
MyHost(string n, vector<MyDescriptor*> d) : name(n),descriptors(d) {
for (MyDescriptor *d : descriptors) {
d->init(name);
}
}
}
MyHostImpl : public MyHost {
public:
// descriptors must be accessible as members like this
MyDescriptor d_1 = MyDescriptor("abc");
MyDescriptor d_2 = MyDescriptor("123");
MyHostImpl(string n) : MyHost(n, {&d_1, &d_2}) {} // This is the issue
void do_thing_1() {
// UPDATE: This is loose example - but what is important to
// know is that developers need to access / use descriptors
// in methods like this.
d_1.do_thing();
}
}
В идеале мне бы хотелось, чтобы прекратить объявлять элементы descriptors
явно; это {&d_1, &d_2}
это то, что я хотел бы устранить. Моя команда использует похожий шаблон и постоянно разочаровывается тем, что случайно не добавляет дескрипторы в вектор после добавления его в класс.