0

次の問題で私を助けてください:

私は次のクラスを持っています:

class ChemicalElement
{
private:
    std::string _name;
    void Init(const std::string& name);
public:
    ChemicalElement(const std::string& name);
    ChemicalElement(const ChemicalElement& ce);
};

class CombinationRule
{
private:
    ChemicalElement _ce1;
    ChemicalElement _ce2;
    void Init(const ChemicalElement& ce1, const ChemicalElement& ce2);
public:
    CombinationRule(const ChemicalElement& ce1, const ChemicalElement& ce2);
    CombinationRule(const CombinationRule& rule);
};

実装は明らかです。コードの重複を最小限に抑えるために、Init メソッドを使用して CombinationRule を初期化するつもりでした。残念ながら、各コンストラクターで「メンバー初期化リスト」を使用しないと、コンパイラーは「エラー C2512: 'ChemicalElement': 適切なデフォルト コンストラクターがありません」というエラーを出します。デフォルトのコンストラクターまたはメンバー初期化リストを使用する代わりに、このエラーを解決するエレガントな方法はありますか? ところで: クラス定義に他の問題がある場合は、それも追加してください。私は C++ を再検討しているので、それらに注意したいと思います。

4

4 に答える 4

3

CombinationRuleの適切なコンストラクターを使用するように、次のようにのコンストラクターを実装する必要がありChemicalElementます。

CombinationRule::CombinationRule(const ChemicalElement& ce1, 
  const ChemicalElement& ce2) : _ce1(ce1), _ce2(ce2) 
{ 
  ... 
}

CombinationRule::CombinationRule(const CombinationRule& rule) : 
  _ce1( rule._ce1 ), _ce2( rule._ce2 )
{
  ...
}
于 2010-01-24T07:08:37.110 に答える
1

この特定の例では、複製を続けます(2つの初期化子を記述しているだけで、執着するものは何もありません)。

しかし、実際の話がもっと複​​雑であると仮定すると、コードの重複を避けるためにOO機能を使用します。

class CombinationRule : public ElementPair ...

また

class Combination { ElementPair twoElements; ...}

ここで、ElementPairには2つのChemicalElementsと1つのコンストラクター(共通コードを含む)が含まれ、CombinationルールコンストラクターはElementPairのコンストラクターを使用して初期化されます。

他のアプローチがあります:InvalidChemicalElementインスタンスでメンバーを初期化するか、InvalidChemicalElementに対してNULLでポインター(auto_ptr)を使用します。

于 2010-01-24T08:34:31.257 に答える
1

任意の種類の配列またはコンテナーでそのクラスのオブジェクトを使用する場合は、他のコンストラクターを定義するクラスにデフォルトのコンストラクターを配置する必要があると思います。ただし、デフォルトのコンストラクターの実装は、空/操作なしのメソッドにすることができます。

メンバー初期化リストを入れる必要はありません (ただし、メンバー初期化リストを使用すると、デフォルトのコンストラクターを介して一度初期化されるのではなく、メンバー変数が一度だけ初期化されるため、場合によってはより効率的になります。 Init() メソッドによって 2 回目に書き込まれます)

于 2010-01-24T06:52:12.860 に答える
1

私はあなたがこれを望んでいると思います

ChemicalElement * ce1;

CombinationRule でデフォルトのコンストラクターを実行しようとしており、ce1 と ce2 の ChemicalElement を取得する必要があると思うので、これを言いますが、間違っている可能性があります。

確かに、クリルの方法は、特定のコンストラクターの変数のコンストラクターを指定する方法ですが、私はそれを言ったので、コンパイラーによって ce1 を構築する必要がないようにしました:)

于 2010-01-24T07:12:56.370 に答える