4

誰もが時々直面する醜いものがあると確信しています。

問題は、クラスにもう 1 つのフィールドを追加し、展開初期化リストを忘れていることです。

class T{
  private:
    field1;
    ...
    field10;
};

T::T( int speedValue ):
field1( Speed::MphToMps(speedValue) ),
field2( new OtherClass(14,5,15) ),
field3( PublicValueGenerator::generateNewFieldValue(0,15) ),
...,
field10( "unpredictable value" );

そして、急いでいくつかのフィールドを追加すると、たとえば newForgottenField のように、初期値を設定するのを忘れてしまうことがあります。私が覚えているように、いくつかのIDEはヒントを与えることができますが、vim + addonsが私の選択です:)

したがって、そのような状況の追跡を簡素化するためのヒント、または警告またはコンパイル時エラーを発生させる経験則または失礼なマクロ (それは驚くべきことです:))? その障害をどのように克服しますか?

よろしくお願いします

4

4 に答える 4

6

g++ を使用している場合は、Scott Meyer の効果的な C++ のガイドラインに違反する構成の警告を有効にするオプションが提供されます:)
オプションは次のとおりです。

-Weffc++ 

他の多くの警告も有効になることに注意してください。また、すべての標準ライブラリ ヘッダーが Meyers のガイドラインに従っているわけではありません。

于 2012-09-18T09:12:23.933 に答える
1

必要なものを取得する 1 つの方法は、すべてのフィールドが、必要なことを実行する既定のコンストラクターを持つか、引数を必要とするコンストラクターのみを持つクラスのインスタンスであることを確認することです。

これは必ずしも便利ではありませんが、問題を確実に解決します。

于 2012-09-18T09:15:23.760 に答える
0

C++11 でこれを解決する最も簡単な方法は、すべてのプリミティブ メンバーに要素初期化子を提供することです。

class T {
private:
    int field1{};
    ...
    int field10{};
};
于 2012-09-18T09:40:59.947 に答える
0

それは良い質問であり、簡単にチェックできると便利ですが、一般に、C++ が実際にサポートできるソリューションには、エラーが発生しやすい、冗長性、および難読化が組み合わされているため、解決しようとしている問題よりも厄介になります。 . それでも - 議論のために - これに対するいくつかのアプローチがあります...

デフォルトのコンストラクターを持たないクラスを作成できます。

template <typename T>
class Explicitly_Initialised
{
  public:
    Explicitly_Initialised(const T& t) : t_(t) { }
    T& operator T() { return t_; }
    const T& operator T() const { return t_; }
  private:
    T t_;
};

または、値が与えられる前にオブジェクトが読み取られた場合にスローするクラスを持つこともできます (そのような概念がある場合は、おそらく「デバッグ」ビルドでのみ)。からの値が適切かどうかを判断できますoperator=bool has_been_initialised_;これを追跡するには、デフォルトのコンストラクターで false に設定されたメンバーが必要です。問題の 1 つはoperator T()、変数が書き込まれる前に読み取られるかどうかがわからないことです。そのため、完全な作業を行うには、その状況を管理するためのプロキシ オブジェクトが必要になる場合があります。

代わりに、実際に推奨するにはあまりにも面倒です。おそらく、型リストを受け入れ、それらの型ごとにメンバー オブジェクトを持ち、コンストラクターで一致するリストを主張するクラスをハックすることもできます。ジェネリック クラスがデータ メンバーにアクセスするための通常の任意の識別子を受け入れることを許可することは困難です (数値アクセス、または型が一意である場合は型ベースのアクセスを許可することは簡単です) (おそらくマクロ ハッカーで動作させることができます)。

于 2012-09-18T09:15:57.920 に答える