【问题标题】:Any suggestion to make the following c++ code precisely? [duplicate]有什么建议可以精确地制作以下 c++ 代码吗? [复制]
【发布时间】:2012-05-14 13:55:22
【问题描述】:

考虑以下讲师,无论如何我都必须初始化 treeItem 和 status ,但是在重载函数中,我也可以引入 id 变量。

但这看起来很傻,我不应该在这两个功能中都这样做,有什么建议吗?

Contact ()
{
    treeItem = NULL;
    status = offline;
}

Contact (const QString & id)
{
    treeItem = NULL;
    status = offline;

    this->id = id;
}

【问题讨论】:

  • 你可以把 treeItem = NULL;状态=离线;进入一个函数并在两者中调用该函数。但实际上,这似乎很好。

标签: c++ constructor overloading


【解决方案1】:

您将从 ctor-initializer-list 中受益,但在升级到 C++11 之前,您确实需要为每个构造函数复制变量初始化。

一种选择是使用默认参数来减少构造函数的数量,如下所示:

Contact (const QString& identifier = QString())
    : treeItem(NULL), status(offline), id(identifier)
{
}

【讨论】:

    【解决方案2】:

    使用默认参数来避免显式定义两个构造函数。并使用初始化列表。像这样:

    Contact (const QString & id = QString())
        : treeItem(NULL)
        , status(offline)
        , id(id) // yes this works but you may wish to change the parameter name)
    {}
    

    或者在 C++11 中使用委托构造函数::

    Contact ()
        : treeItem(NULL)
        , status(offline)
    {}
    
    Contact (const QString & id = QString())
        : Contact()
        , id(id)
    {}
    

    【讨论】:

      【解决方案3】:

      如果你真的想重载构造函数(而不是提供默认值),你能做的最好的是将通用代码移到它自己的函数中,然后从每个构造函数中调用它:

      Contact()
      {
          init();
      }
      
      Contact(const QString &id)
      {
          init();
          this->id = id;
      }
      
      private void init() {
          treeItem = NULL;
          status = offline;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-04-11
        • 2023-03-24
        • 2020-06-03
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2021-06-09
        • 1970-01-01
        • 2020-12-07
        相关资源
        最近更新 更多