gpt4 book ai didi

c++ - 在 C++ 中实现通用构建器模式

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:42 24 4
gpt4 key购买 nike

我决定使用 builder模式以避免长的未命名参数构造函数,但我有一个特定的用例。我有一个基类和一些继承自它的类,它们都必须能够单独构造。下面显示了一个伪代码来解释我的特殊用例:

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++。

更新:

有一个解决方案接受 B 作为 I 的构造函数的参数,但在实际问题中存在一些继承层,使用该解决方案不是很实用。

最佳答案

我们可以为类 I 设置一个 Builder,它最终会分配类 I 及其基类 的属性BBuilder 应该是类 I 的 friend ,这样我们就可以访问 Builder 的 protected 成员,而且我们还可以确保所有属性Builder 都可用。

考虑类 B:

class B {
protected:
int first;
int second;

public:
int get_first() { return this->first; }

int get_second() { return this->second; }
};

并且,I 类:

class I : public B {
int third;
int fourth;

public:
int get_third() { return this->third; }

int get_fourth() { return this->fourth; }

class Builder : public B {
int third;
int fourth;

public:
Builder &set_first(const int &first) {
this->first = first;
return *this;
}

Builder &set_second(const int &second) {
this->second = second;
return *this;
}

Builder &set_third(const int &third) {
this->third = third;
return *this;
}

Builder &set_fourth(const int &fourth) {
this->fourth = fourth;
return *this;
}

friend class I;
};

I(const Builder &builder);
};

因此,它允许我们为属性赋值:

I::I(const I::Builder &builder) {
this->first = builder.first;
this->second = builder.second;
this->third = builder.third;
this->fourth = builder.fourth;
}

示例

int main() {
I::Builder builder;

I i = builder.set_first(100).set_second(102);
std::cout << "[sample 1] first: " << i.get_first() << "\n";
std::cout << "[sample 1] second: " << i.get_second() << "\n";
std::cout << "[sample 1] third: " << i.get_third() << "\n";
std::cout << "[sample 1] fourth: " << i.get_fourth() << "\n";
std::cout << "\n";

i = builder.set_first(12).set_second(13).set_third(14).set_fourth(15);
std::cout << "[sample 2] first: " << i.get_first() << "\n";
std::cout << "[sample 2] second: " << i.get_second() << "\n";
std::cout << "[sample 2] third: " << i.get_third() << "\n";
std::cout << "[sample 2] fourth: " << i.get_fourth() << "\n";
std::cout << "\n";

i = builder.set_first(1).set_third(3);
std::cout << "[sample 3] first: " << i.get_first() << "\n";
std::cout << "[sample 3] second: " << i.get_second() << "\n";
std::cout << "[sample 3] third: " << i.get_third() << "\n";
std::cout << "[sample 3] fourth: " << i.get_fourth() << "\n";

return 0;
}

它产生以下输出:

[sample 1] first: 100
[sample 1] second: 102
[sample 1] third: 0
[sample 1] fourth: 0

[sample 2] first: 12
[sample 2] second: 13
[sample 2] third: 14
[sample 2] fourth: 15

[sample 3] first: 1
[sample 3] second: 13
[sample 3] third: 3
[sample 3] fourth: 15

关于c++ - 在 C++ 中实现通用构建器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53693338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com