c++ - 将实例应用到Builder设计模式时出现的一些错误
问题描述
我编写了一个应用“Builder”设计模式的代码,但出现了一些错误:
编码:
class Builder {
public:
int m_suger;
int m_cup;
string m_flavour;
Builder* sugar(int sugar) {
this->m_suger = sugar;
return this;
}
Builder* cup(int cup) {
this->m_cup = cup;
return this;
}
Builder* flavour(string flavour) {
this->m_flavour = flavour;
return this;
}
Tea* build() {
return new Tea(this);
}
};
class Tea {
public:
int m_suger;
int m_cup;
string m_flavour;
Tea(Builder* b) {
m_suger = b->m_suger;
m_cup = b->m_cup;
m_flavour = b->m_flavour;
cout << "Hot " << b->m_cup << " cup of tea is comming!, with " << b->m_flavour << endl;
}
};
int main(int argc, char *argv[]) {
Tea* mintTea = new Builder()->cup(2)->sugar(3)->flavour("mint")->build();
return 0;
}
解决方案
您处于这样的情况,其中的函数Builder
需要Tea
是一个完整的类,而函数中的函数Tea
需要Builder
是一个完整的类。但这并不矛盾:在你开始定义你的函数之前Builder
,它们都可以是完整的类。Tea
class Tea; // Forward declaration is needed so Builder can mention Tea in its member function declarations.
class Builder {
public:
int m_suger;
int m_cup;
string m_flavour;
Builder* sugar(int sugar);
Builder* cup(int cup);
Builder* flavour(string flavour) ;
Tea* build();
};
class Tea {
public:
int m_suger;
int m_cup;
string m_flavour;
Tea(Builder* b);
};
课程现已完成,您可以访问其所有成员。现在您可以继续定义它们的功能:
Builder* Builder::sugar(int sugar) {
this->m_suger = sugar;
return this;
}
Builder* Builder::cup(int cup) {
this->m_cup = cup;
return this;
}
Builder* Builder::flavour(string flavour) {
this->m_flavour = flavour;
return this;
}
Tea* Builder::build() {
return new Tea(this);
}
Tea::Tea(Builder* b) {
m_suger = b->m_suger;
m_cup = b->m_cup;
m_flavour = b->m_flavour;
cout << "Hot " << b->m_cup << " cup of tea is comming!, with " << b->m_flavour << endl;
}
第一段代码通常是放在头.h
文件#include
(.cpp
在幕后实现通常与其他代码无关/影响。
注意:正确的调用main
必须是:
Tea* mintTea = (new Builder())->cup(2)->sugar(3)->flavour("mint")->build();
注意周围的括号new Builder()
。
推荐阅读
- javascript - 获取 span 标签 HTML 的值
- javascript - 量角器将变量值显示为“未定义”
- titanium - Appcelerator:如何创建动态调整内容但高度最小的 Ti.UI.TextArea
- android - 将用户添加到 firebase 组
- python - A*/寻路算法的结果不正确
- python - 使用 strptime 解析的 Python - 月日时:分:秒年时区 - 与格式不匹配
- javascript - 用 const 声明对象变量
- julia - 通过实例列表扩展向量列表 - Julia
- square-connect - 是否可以将交易行项目链接到 Square pos API 中的销售交易
- xslt - 使用 XSLT 展平:我想将一种元素移动一层