首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >委托给默认的C++构造函数

委托给默认的C++构造函数
EN

Stack Overflow用户
提问于 2021-03-08 06:28:34
回答 3查看 137关注 0票数 3

假设C++类A的成员都可以由各自的副本构造函数复制。我们可以依赖于A的默认复制构造函数来复制其成员:

代码语言:javascript
运行
复制
class A {
  private:
    A(const A&) = default; // We don't really need this line
    int a;
    B b;
    double c;
}

但是现在让我们假设我希望“扩展”(或注释)A的默认构造函数,这样除了复制它的成员之外,它还会做其他的事情,例如向日志文件写一行。

我想写这样的东西:

代码语言:javascript
运行
复制
class A {
  public:
    A(const A& a) : A::default(A) {
      print("Constructing A\n");
    }
  private:
    // like before
}

不幸的是,这是不正确的C++语法。

那么,是否有一种语法允许在显式定义相同构造函数的同时委托给默认的C++构造函数?

EN

回答 3

Stack Overflow用户

发布于 2021-03-08 07:07:34

最简单的方法是将所有成员移动到基类中,并在派生类中写入消息:

代码语言:javascript
运行
复制
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");
   }
};
票数 4
EN

Stack Overflow用户

发布于 2021-03-08 06:33:24

您可以像默认初始化成员变量一样将其委托给默认构造函数:

代码语言:javascript
运行
复制
A(const A&) : A()
{
    ...
}
票数 1
EN

Stack Overflow用户

发布于 2021-03-08 09:58:31

就像往常一样,“我们可以通过引入额外的间接级别来解决任何问题。”( "…,除了太多的间接方向问题外,")

代码语言:javascript
运行
复制
struct VerboseA
{
   VerboseA() = default;
   VerboseA(const VerboseA&) { print("Constructing A\n"); }
   VerboseA(VerboseA&&) { print("Constructing A\n"); }
};

然后

代码语言:javascript
运行
复制
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中

代码语言:javascript
运行
复制
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;
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66525212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档