如何在c++中实现二次构造函数
How can I do second-like constructor in c++?
我有一个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;
};
上面,A
中的init
函数必须在A
中构造,但必须在magic_str
初始化之后调用。magic_str
必须在class B
中初始化,因为有一些自定义逻辑。
如何在A
中强制B
调用init
?
总而言之,我想把A
中的构造函数代码分成两部分,在这两部分之间,一些用户定义的行为必须在其子类B
中初始化。
一种方法是将魔法字符串作为构造函数传递给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;
};
另一种方法是使用构建器模式,并让它处理您希望创建对象的复杂方式:
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;
};
由于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)...
我会将逻辑更改为如下内容:
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;
};
相关文章:
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 如何在派生构造函数中多次构造基类
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 如果函数按值传递并按值返回,将调用复制构造函数多少次
- C++:链接库两次,全局构造函数运行两次吗?
- 如何在 constexpr 构造函数中初始化矩阵一次?
- 重载运算符 new(),为什么构造函数被调用两次?
- Cgal二次规划目标函数
- 复制构造函数被调用了多少次?
- Cython c++模块,多次调用构造函数
- 为同一存储位置调用构造函数两次是否合法?
- 为什么在下面的代码中调用复制构造函数两次
- 为什么这个构造函数被调用两次
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- 使用递归的二维链表复制构造函数
- 如何在 c++ 中初始化构造函数中的二维数组
- 多次调用对象的构造函数
- std::make_shared在VS2012中进行了两次构造函数调用
- 如何在c++中实现二次构造函数