【发布时间】:2019-03-10 12:44:38
【问题描述】:
我正在尝试确定可以使用哪种模式以更“组合”和更少“命令”的方式声明 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} 是我想要消除的。我的团队使用了类似的模式,并且在将向量添加到类后不小心没有将描述符添加到向量中,因此经常感到沮丧。
【问题讨论】:
-
为了确保我理解:出于某种目的,您需要保留
descriptors成员(或等效项),是吗?所以问题是如何初始化它,或者如何实现不需要显式初始化的替换? -
这可能有助于展示如何使用
descriptors的代表性示例。 -
查找
std::initializer_list。 -
@JohnBollinger 是的,你是对的。
descriptors需要是班级成员。它们目前以惰性方式初始化,并且在内部/外部的类中使用很多。hosts本质上只是对descriptors组具有特定抽象的包装类。描述符仍被声明为成员并以某种方式初始化的替代实现将是一个理想的解决方案。优选的MyHost实现不必进行显式初始化。我会更新示例...
标签: c++ class composition