如果我有一个带有2个必需参数和4个可选参数的构造函数,如果我使用默认参数(我不喜欢因为它很差),我怎么能避免编写16个构造函数,甚至编写10个左右我必须编写的构造函数自文档)?有没有使用模板的习语或方法我可以使用它来减少繁琐?(更容易维护?)
您可能对命名参数成语感兴趣.
总而言之,创建一个包含要传递给构造函数的值的类.添加一个方法来设置每个值,并让每个方法return *this;
在最后执行.在类中有一个构造函数,它接受对这个新类的const引用.这可以这样使用:
class Person; class PersonOptions { friend class Person; string name_; int age_; char gender_; public: PersonOptions() : age_(0), gender_('U') {} PersonOptions& name(const string& n) { name_ = n; return *this; } PersonOptions& age(int a) { age_ = a; return *this; } PersonOptions& gender(char g) { gender_ = g; return *this; } }; class Person { string name_; int age_; char gender_; public: Person(const PersonOptions& opts) : name_(opts.name_), age_(opts.age_), gender_(opts.gender_) {} }; Person p = PersonOptions().name("George").age(57).gender('M');
如果您创建了包含所有字段的参数对象,该怎么办?然后你可以通过它,只需设置你需要的任何字段.这个模式可能有一个名称,但不确定它是什么......
更新:
代码可能看起来像这样:
paramObj.x=1; paramObj.y=2; paramObj.z=3; paramObj.magic=true; ... //set many other "parameters here" someObject myObject = new someObject(paramObj);
在someObject
构造函数内部,您可以为尚未设置的事物设置默认值(如果是必需的话,则引发错误).
老实说,我不是这个解决方案的忠实粉丝,但是paramObj
通过包含一组通常全部聚集在一起的数据(因此我们可以将其用于更多只是构造函数),我已经使用过一次或两次.它比多个构造函数更好.YMMV,我发现它很丑,但它很有用.