0

假设我有一个 CPP 类

 class A {
    A() :
     max_(0),
     num_(0),
     sum_(0),
     sum_squares_(0) {}

    void Clear() {
      min_ = bucketMapper.LastValue();
      max_ = 0;
      num_ = 0;
      sum_ = 0;
      sum_squares_ = 0;
    }

    void SomethingElse {}
}

我在构造函数和 Clear 中有初始化代码,有没有办法可以避免两次使用相同的代码。

4

2 回答 2

4

如果您需要多个调用相同逻辑的构造函数,则应将所有构造函数编写在ClearorReset函数中并从每个构造函数中调用它。

在相当少的情况下需要初始化器列表,除此之外,它只是提高效率的首选。

它是必需的:

  • 基类(除非默认不存在参数构造函数并且您可以调用它)
  • 作为参考的成员
  • const会员
于 2013-02-01T01:33:33.543 回答
2

这个原始代码,

 class A {
    A() :
     max_(0),
     num_(0),
     sum_(0),
     sum_squares_(0) {}

    void Clear() {
      min_ = bucketMapper.LastValue();
      max_ = 0;
      num_ = 0;
      sum_ = 0;
      sum_squares_ = 0;
    }

    void SomethingElse {}
}

由于缺少参数列表和分号,将无法编译,并且无法min_在默认构造函数中初始化,从而使该成员具有不确定的值,并且其中的所有内容都无法访问

你真的想赋予min_不同的、新的价值Clear吗?

如果不是,那么只需分配一个默认构造的实例:

*this = A();

从构造函数调用Clear通常不是一个好主意,主要是因为它非常类似于用赋值来表达构造的不良习惯,因此可能会诱使您这样做。

对于更通用的解决方案,请排除纯数据:

namespace detail {
    struct A_Data
    {
        double min_;
        double max_;
        int    num_;
        double sum_;
    };
}  // namespace detail

class A
    : private detail::A_Data
{
public:    
    A(): detail::A_Data() {}

    void clear()
    {
        *this = A();
        min_ = bucketMapper.LastValue();
    }

    void somethingElse() {}
};

但最有可能

*this = A();

将作为您的需求的解决方案。


-1 表示非真实代码。请在以后的问题中发布真实代码。不像。

于 2013-02-01T01:41:57.057 回答