首页 > 解决方案 > 将实例应用到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;
}

标签: c++design-patterns

解决方案


您处于这样的情况,其中的函数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()


推荐阅读