0

Boost Parameterチュートリアルを使用して、トランプ ジェネレーター用の名前付きパラメーター コンストラクターを作成しています。チュートリアルでは ArgumentPack を基本クラスに入れるように書かれていますが、カード ジェネレーター クラスの変数を変更したいと考えています。私はこれを行うことを考えました:

class CGconstructor_base {
public:
      template<class ArgumentPack>
      CGconstructor_base(ArgumentPack const& args);/*tutorial says to put code
      in this function */
      friend CardGenerator;//so it can modify the variables of CardGenerator
}
class CardGenerator:public CGconstructor_base;

これは合法ですか、それとも CardGenerator のプライベート変数を操作してブースト パラメータ ライブラリを使用するより良い方法はありますか? OS: Windows XP Pro、コンパイラ: Visual C++ 2008 Express、ブースト: 1.39.0

4

1 に答える 1

1

クリーンアップが必要だと思います。

  1. CGconstructor_base が CardGenerator 属性にアクセスできるようにしたいというコメントから、友人の宣言は適切に配置されていないようです: これがそうである場合、友人の宣言は CardGenerator に入ります (私が友人と見なす人を言います。あなたは自分自身を次のように宣言しません)。友達だと思っている人です)。

  2. とにかくなぜあなたは友達が必要なのですか?チュートリアルのように構造体を使用し、属性を CGconstructor_base に詰め込んだ方がはるかに良いでしょう。このようにして、この補助行なしで CardGenerator から自然にアクセスできるようになります。'friend' キーワードなしでできる場合は、そうする必要があります (通常の警告: そうしてもコストがあまり増加しない場合)。

  3. ここでPRIVATE継承が必要な場合、これは詳細な実装です。他のクラス/メソッドがあなたを「ベースとして」使用することを知る必要がある場合にのみ、パブリック継承(または保護さえも)を使用してください。

手短に:

struct CGconstructor_base {
      template<class ArgumentPack>
      CGconstructor_base(ArgumentPack const& args);/*tutorial says to put code
      in this function */

      cg_type1 cg_attr1;
      cg_type2 cg_attr2;
}; // don't forget this

class CardGenerator:private CGconstructor_base {};

なぜ「継承」がよりクリーンな構成ではなくブーストによって選択されたのか疑問に思います。継承を悪用する方がはるかに簡単です(そして多重継承が必要です)...それはそれ自体の主題の価値があると思います。

于 2009-09-28T14:26:28.743 に答える