我已经编写了一个应用“ 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;
}
答案 0 :(得分: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()
周围的括号。