我有一个class A
和class B
,B
这里是A
的子类:
class A {
public:
A(int a) : obj(a) {}
void init() {
if(magic_str == "hello") {
// do init c
c = 7;
}
}
private:
int obj;
int c;
protected:
string magic_str;
};
class B : public A {
public:
B(int a, double _b) : A(a), b(_b){}
void set_magic_str() {
magic_str = "hello";
}
private:
double b;
};
上面,init
中的A
函数必须在A
中构建,但必须在magic_str
初始化后调用。必须在magic_str
中初始化class B
,因为有一些用户定义的逻辑。
如何强制B
在init
中调用A
?
总而言之,我想将A
中的构造函数代码分成两部分,在这两部分之间,必须在他的子类B
中初始化一些用户定义的行为。
答案 0 :(得分:4)
一种方法是将魔术字符串作为构造函数传递给A
构造函数,并在构造函数中调用init。
class A {
public:
A(int a, string m) : obj(a), magic_str(m)
{
init();
}
void init() {
if(magic_str == "hello") {
// do init c
c = 7;
}
}
private:
int obj;
int c;
protected:
string magic_str;
};
class B : public A {
public:
B(int a, double _b) : A(a,get_magic_str()), b(_b){}
static string get_magic_str() {
return "hello";
}
private:
double b;
};
答案 1 :(得分:0)
另一种方法是使用builder pattern并让它处理您希望创建对象的复杂方式:
class A {
public:
A(int a) : obj(a) {}
void init() {
if(magic_str == "hello") {
// do init c
c = 7;
}
}
private:
int obj;
int c;
protected:
string magic_str;
};
class B : public A {
public:
static B create (int a, double _b) // <-- only allow instances to be created via this function
{
B b = B(a, _b);
b.init();
return b;
}
void set_magic_str() {
magic_str = "hello";
}
private:
B(int a, double _b) : A(a), b(_b){} //maybe protected
double b;
};
答案 2 :(得分:0)
由于init是A的非私有成员函数,B是从A派生的,因此可以调用init。 设置magic_string之后调用它,例如。构造函数。
A::init();
否则,请更改A的构造函数,并在B中使用它。
A(int a, string s)
B(int a, double _b): A (a, magic_str)...
答案 3 :(得分:0)
我会将逻辑更改为:
class A {
public:
A(int a) : obj(a), c(0) {}
protected:
void set_magic_str(const std::string& s) {
magic_str = s;
if (magic_str == "hello") {
// do init c
c = 7;
}
}
private:
int obj;
int c;
std::string magic_str;
};
class B : public A {
public:
B(int a, double _b) : A(a), b(_b){}
void set_magic_str() {
A::set_magic_str("hello");
}
private:
double b;
};