我有一个基类和多个派生类。每个派生类都有一个构造函数,它接受在基类中初始化的参数。所有构造函数都是不同的,但它们都接受一个公共参数,我们称之为Name
。
我是否有办法以较短的方式显示每个派生类的名称,而不是一个接一个地调用它们?
这是一个例子。假设我的基类是Father
,我的派生类是Brother, Sister, HalfBrother, HalfSister
,这是我的驱动文件:
cout << Brother::Brother().getName() << endl
<< Sister::Sister().getNAme() << endl
<< HalfBrother::HalfBrother().getNAme() << endl
<< HalfSister::HalfSister().getName() << endl;
这将使它们返回正常,但是有一种更简单的方法可以实现这一点,这样我就可以从所有派生类中获取所有名称,而无需逐个编写它们吗?
答案 0 :(得分:1)
您可以创建类的静态注册表,并将其插入到您要插入到要注册的类中的静态成员的构造函数中。
在标题中:
class Registration {
static vector<string> registered;
public:
static void showRegistered() {
for (int i = 0 ; i != registered.size() ; i++) {
cout << registered[i] << endl;
}
}
Registration(string name) {
registered.push_back(name);
}
};
在CPP文件中:
vector<string> Registration::registered;
掌握了这门课程,你可以这样做:
在标题中:
class A {
static Registration _registration;
};
class B {
static Registration _registration;
};
class C {
static Registration _registration;
};
在CPP文件中:
Registration A::_registration("quick");
Registration B::_registration("brown");
Registration C::_registration("fox");
最后一部分是关键:静态_registration
变量的声明有副作用 - 它们将名称插入vector<string> registered
类的Registration
,没有特定的顺序。您现在可以检索名称,打印出来,或者随意使用它们。我添加了一个用于打印的成员函数,但显然你不受它的限制。
这是demo on ideone - 它打印
quick
brown
fox
答案 1 :(得分:0)
老实说,我不确定我是否理解你的问题。如评论中所述,您应该在父中使getName()成为一个方法。
class Father {
public:
Father(string name) : m_name(name) {
}
string& getName() {
return m_name;
}
private:
string m_name;
};
class Brother : public Father {
public:
Brother(string name) : Father(name) {
}
};
class Sister : public Father {
public:
Sister(string name) : Father(name) {
}
};
所以你可以拥有类似的东西:
vector<Father *> fathers;
Brother brother("...");
Sister sister("....");
father.push_back(&brother);
father.push_back(&sister);
for (vector<Father*>::iterator itr = fathers.begin();
itr != fathers.end();
++itr) {
cout << (*itr)->getName() <<endl;
}