我正在使用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参数库? 操作系统:Windows XP Pro,Compilier:Visual C ++ 2008 Express,Boost:1.39.0
答案 0 :(得分:1)
我认为我们需要一些清理工作。
朋友声明似乎不合适,从你希望CGconstructor_base能够访问CardGenerator属性的评论:如果是这样,那么朋友声明进入CardGenerator(我说我认为谁是我的朋友,你没有宣称自己是我认为是朋友的人。
为什么你还需要朋友?如果在教程中你使用了一个结构然后将属性填充到CGconstructor_base中会好得多。通过这种方式,您可以自然地从CardGenerator访问它们而无需此补充线。当你没有“朋友”关键词时你应该这样做(通常需要注意:如果这样做不会增加太多的成本)。
您希望 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 {};
我确实想知道为什么'继承'是通过提升选择而不是(我认为)更清洁的成分。滥用继承(并且需要多重继承)要容易得多......我认为它值得一个自己的主题。