我决定使用builder模式来避免长的unnamed-arguments构造函数,但我有一个特定的用例 . 我有一个基类和一些继承的类,它们都必须能够单独构造 . 下面显示一个伪代码解释我的特殊用例:
class B
{
int i;
int j;
public:
B& setI(int i) {this->i=i; return *this;}
B& setJ(int j) {this->j=j; return *this;}
}
class I : public B
{
int i2;
int j2;
public:
I& setI2(int i) {this->i2=i; return *this;}
I& setJ2(int j) {this->j2=j; return *this;}
}
B b = B().setI(12).setJ(13); // ok
I i = I().setI(12).setJ(13).setI2(14).setJ2(15); // error the first and second function return B not I
上面的代码无法编译,因为B中的函数没有返回类型的类I.在this post中已经提出了一个解决方案,但它是有限的,并且不可能单独创建基类 . 我使用的是c 11,但可以使用另一个版本的c .
Update:
有一个解决方案接受B作为I构造函数的参数,但在实际问题中有一些继承层使用这个解决方案并不是很实用 .
1 回答
我们可以为
I
类创建一个Builder
,它最终会分配类I
及其基类B
的属性 .Builder
应该是I
类的朋友,以便我们可以访问Builder
的受保护成员,并且我们确保所有属性都可用于Builder
.考虑类
B
:而且, class
I
:因此,它允许我们为属性赋值:
Example
它产生以下输出: