我有这个代码用于在C ++中调用父初始化程序。
#include <iostream>
using namespace std;
class A
{
public:
A(const string& a) {}
};
class B : public A
{
public:
B(const string& b) : A(b) {}
};
我想我可以用这样的父初始化器来装饰一点点。
B(const string& b) : A(b + "!!") {}
然后,当我需要一些决策逻辑来设置父初始化程序时呢? 我尝试了这个,但我收到了错误消息。
B(const string& b) {
if (...) {
A(b + "x");
} else {
A(b + "y");
}
}
>> ERROR
hier.cpp: In constructor 'B::B(const string&)':
hier.cpp:16:2: error: no matching function for call to 'A::A()'
答案 0 :(得分:3)
您在初始化列表中对其进行编码:
B(const string& b) : A(b + ((...) ? "x" : "y")) {}
如果“决策逻辑”变得更复杂,则将其分解为单独的函数(通常是私有静态成员)。
答案 1 :(得分:2)
如果你想要执行复杂的逻辑,最好把它放在一个单独的函数中:
std::string modify(const std::string &b) {
if (...) {
return b + "x";
} else {
return b + "y";
}
}
然后您可以在初始化列表中使用该函数:
B(const string& b) : A(modify(b)) {}
答案 2 :(得分:1)
您可以在基类的构造函数中放置一个静态私有方法,如下所示:
class B : public A
{
public:
B(const string& b) : A(initval(b)){}
private:
static string initval(const string& b) {
if (...)
return b + "x";
else
return b + "y";
}
};
答案 3 :(得分:1)
除了sth的答案之外,我还将修改函数设为B的静态方法。
std::string B::modify(const std::string &b) {
if (...) {
return b + "x";
} else {
return b + "y";
}
}
在课程定义中:
static std::string B::modify(const std::string &b)
然后,使用它:
B(const string& b) : A(B::modify(b)) {}
这样做的原因是它将完全封装在B中,而不是作为一个单独的函数在外面。它会更加面向对象。
答案 4 :(得分:0)
只要您调用相同的构造函数(对初始化程序使用相同的签名),就可以使用Casey的答案。但是,如果你想做这样的事情:
B(const string& b) {
if (...) {
A(b + "x");
} else {
A(foo, bar);
}
}
那时你注定要失败。在C ++中没有这样的东西。绕过它的唯一方法是调用默认构造函数,然后使用专门的成员函数(通常称为init()或类似的东西)进行初始化。当你拥有一堆不同的构造函数时,你需要使用相同的技术,这些构造函数应该通过相互调用来实现,这在C ++中是可取的。这两个问题都没有像Objective-C那样美丽的语言。