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 中的私有变量并使用 Boost Parameter 库?操作系统:Windows XP Pro,编译器:Visual C++ 2008 Express,Boost:1.39.0

4

1 回答 1

1

我认为我们需要一些清理工作。

  1. 朋友声明似乎不合适,从您希望 CGconstructor_base 能够访问 CardGenerator 属性的评论中:如果是这样,那么朋友声明进入 CardGenerator (我说我认为谁是我的朋友,你不声明自己是作为一个我认为是朋友的人)。

  2. 为什么你还需要朋友?如果像教程中那样使用结构然后将属性填充到 CGconstructor_base 中会更好。这样,您将能够自然地从 CardGenerator 访问它们,而无需此补充行。当您可以不使用“朋友”关键字时,您应该这样做(通常的警告:如果这样做不会增加太多成本)。

  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 回答