在将实际示例应用于Builder设计模式期间,出现了一些错误

时间:2018-06-22 14:37:54

标签: c++ design-patterns

我已经编写了一个应用“ 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;
}

1 个答案:

答案 0 :(得分:0)

您遇到的情况是Builder中的函数要求Tea是一个完整的类,而Tea中的函数需要Builder是一个完整的类。但这并不矛盾:在开始定义函数之前,BuilderTea都可以是完整的类。

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;
}

Demo!

代码的第一部分通常是放在头文件(.h)中的部分,以便其他代码#include与您的类一起使用,而第二段将进入其自己的编译单元(.cpp),因为通常如何在后台实现这些功能与其他代码无关。

注意:main中的正确呼叫必须是:

Tea* mintTea = (new Builder())->cup(2)->sugar(3)->flavour("mint")->build();

请注意new Builder()周围的括号。