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 に初期化コードがあります。同じコードを 2 回使用しないようにする方法はありますか。

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 に答える