c++ - 生成器设计模式对我不起作用

标签 c++ builder

我刚写的 C++ 代码有问题。该代码是 Builder 设计模式的示例。我创建了一个抽象生成器类,并从该类继承了两个类:MonsterBuilder 和 RuffianBuilder。我创建了一个 Builder 类,这个类接收一个 Monster 或一个 RuffianBuilder,并构造这些类的新实例。问题来了:如果使用 MonsterBuilder 类来构建新实例,则程序会因错误而终止(a.exe 已停止工作)。如果 Builder 接收到一个 RuffianBuilder,它会毫无错误地构造一个新实例。这是示例代码:

#include <iostream>

class Character
{
private:
    // Attributes
    int dex;
    int str;
    int end;

    // skills
    int lockpick;
    int guns;
    int sneak;

    /*****************************************  Setters  ********************************************************/
    // Attribute setters
public:
    void setStrength(const int &s)
    {
        this->str = s;
    }

    void setDexterity(const int &d)
    {
        this->dex = d;
    }

    void setEndurance(const int &e)
    {
        this->str = e;
    }

    // Skill setters
    void setLockpick(const int &s)
    {
        this->lockpick = s;
    }

    void setSneak(const int &s)
    {
        this->sneak = s;
    }

    void setGuns(const int &s)
    {
        this->guns = s;
    }

    int getGuns()
    {
        return this->guns;
    }

    int getStrength()
    {
        return this->str;
    }
};


/* Abstract builder */
class CharacterBuilder
{
protected:
    Character * int_character;
public: 
    Character * getCharacter()
    {
        return int_character;
    }

    void buildCharacter()
    {
        int_character = new Character;
    }

    virtual void buildSkills() = 0; 
    virtual void buildAttributes() = 0;

};

class MonsterBuilder : public CharacterBuilder
{
public:
    virtual void buildSkills()
    {
        int_character->setLockpick(10);
        int_character->setSneak(12);
        int_character->setGuns(50);
    }

    virtual void buildAttributes()
    {
        int_character->setStrength(5);
        int_character->setDexterity(5);
        int_character->setEndurance(5);
    }
};

class RuffianBuilder : public CharacterBuilder
{
public:
    virtual void buildSkills()
    {
        int_character->setLockpick(10);
        int_character->setSneak(12);
        int_character->setGuns(50);
    }

    virtual void buildAttributes()
    {
        int_character->setStrength(5);
        int_character->setDexterity(5);
        int_character->setEndurance(5);
    }
};

class Builder
{
public:
    void setBuilder(CharacterBuilder * builder)
    {
        this->builder = builder;
    }

    Character * getCharacter()
    {
        return builder->getCharacter();
    }

    void buildCharacter()
    {
        //std::cout << builder->buildSkills;
        builder->buildSkills();
        builder->buildAttributes();     
    }

private:
    CharacterBuilder * builder;
};

int main()
{
    Builder B;
    RuffianBuilder R;
    MonsterBuilder Mo;

    B.setBuilder(&R);
    B.buildCharacter();
    std::cout << B.getCharacter()->getGuns();
    std::cout << B.getCharacter()->getStrength();

    B.setBuilder(&Mo);
    B.buildCharacter();
    //std::cout << B.getCharacter()->getStrength();
    return 0;
}

是什么导致了这个问题?有人可以解释一下吗?

最佳答案

读取未初始化的变量会导致未定义的行为。

我将 builder->buildCharacter(); 添加到 Builder::buildCharacter() 中,然后这段代码似乎运行良好。

class Builder
{
public:
    void setBuilder(CharacterBuilder * builder)
    {
        this->builder = builder;
    }

    Character * getCharacter()
    {
        return builder->getCharacter();
    }

    void buildCharacter()
    {
        //std::cout << builder->buildSkills;
        builder->buildCharacter(); // add this line
        builder->buildSkills();
        builder->buildAttributes();     
    }

private:
    CharacterBuilder * builder;
};

关于c++ - 生成器设计模式对我不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33960550/

相关文章:

java - 我的构建器对象的实现有哪些缺点?

java - 如何使用强制变量强制实例化不可变的pojo?

c++ - 用另一个子字符串 C++ 替换子字符串

c++ - 为什么 `equal` 在 C++ 中适用于 const char*?

c++ - 谷歌模拟中的 TEST_F 给出错误

android - 如何在 AlertDialog Android 中插入 editText 编号

android - 什么是 Android 中的 Builder 类,它的用途是什么?

java - 嵌套静态构建器类,对其管道的进一步解释

c++ - 在 ubuntu 10.04 下安装最新的 1.44 boost 库

c++ - 使用 C++ 进行测试驱动开发 : How to test a class which depends on other classes?