假设C++类A的成员都可以由各自的副本构造函数复制。我们可以依赖于A的默认复制构造函数来复制其成员:
class A {
private:
A(const A&) = default; // We don't really need this line
int a;
B b;
double c;
}但是现在让我们假设我希望“扩展”(或注释)A的默认构造函数,这样除了复制它的成员之外,它还会做其他的事情,例如向日志文件写一行。
我想写这样的东西:
class A {
public:
A(const A& a) : A::default(A) {
print("Constructing A\n");
}
private:
// like before
}不幸的是,这是不正确的C++语法。
那么,是否有一种语法允许在显式定义相同构造函数的同时委托给默认的C++构造函数?
发布于 2021-03-08 07:07:34
最简单的方法是将所有成员移动到基类中,并在派生类中写入消息:
class A_helper {
private:
int a;
B b;
double c;
};
class A : public A_helper {
public:
A() = default;
A(const A& a) : A_helper(a) {
print("Constructing A\n");
}
A(A&& a) : A_helper(std::move(a)) {
print("Constructing A\n");
}
};发布于 2021-03-08 06:33:24
您可以像默认初始化成员变量一样将其委托给默认构造函数:
A(const A&) : A()
{
...
}发布于 2021-03-08 09:58:31
就像往常一样,“我们可以通过引入额外的间接级别来解决任何问题。”( "…,除了太多的间接方向问题外,")
struct VerboseA
{
VerboseA() = default;
VerboseA(const VerboseA&) { print("Constructing A\n"); }
VerboseA(VerboseA&&) { print("Constructing A\n"); }
};然后
class A : VerboseA // EBO (Empty Base Optimisation)
{
private:
A(const A&) = default; // We don't really need this line
int a;
B b;
double c;
};或在C++20中
class A {
private:
A(const A&) = default; // We don't really need this line
[[no_unique_address]]VerboseA verbose; // "EBO" equivalent with attribute
int a;
B b;
double c;
};https://stackoverflow.com/questions/66525212
复制相似问题