生成器设计模式不适用于我

费伦茨·费克特(Ferenc Fekete)

我刚编写的C ++代码有问题。该代码是Builder设计模式的样本。我创建了一个抽象的构建器类,并从该类继承了两个类:MonsterBuilder和RuffianBuilder。我创建了一个Builder类,该类接收Monster或RuffianBuilder,并构造这些类的新实例。问题来了:如果将MonsterBuilder类用于构建新实例,则程序将终止并显示错误(a.exe已停止工作)。如果生成器收到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;
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

生成器列表不适用于CSV库

来自分类Dev

列表反向不适用于我的模式吗?

来自分类Dev

滑行不适用于我

来自分类Dev

设计模式不适用于 OnClickListener

来自分类Dev

Bootstrap Typeahead Bloodhound令牌生成器不适用于多个值

来自分类Dev

随机数生成器不适用于输出的2D数组-C ++

来自分类Dev

我的where子句不适用于我的结果

来自分类Dev

stringify不适用于我的javascript数组

来自分类Dev

删除链接不适用于我的模型

来自分类Dev

输入重定向不适用于我的程序

来自分类Dev

jQuery滚动不适用于我的网站

来自分类Dev

Gradle exec commandLine不适用于我

来自分类Dev

阵列反向不适用于我...

来自分类Dev

jqBootstrapValidation插件不适用于我的表单

来自分类Dev

input()函数不适用于我(Python 3.3)

来自分类Dev

RadioGroup检查不适用于我

来自分类Dev

SQL Server ISNULL不适用于我的查询

来自分类Dev

滑动功能不适用于我的if语句

来自分类Dev

查找不适用于我的变量

来自分类Dev

xml布局不适用于我

来自分类Dev

jQuery不适用于我的HTML

来自分类Dev

jQuery不适用于我的HTML

来自分类Dev

分页链接不适用于我

来自分类Dev

静态Google地图不适用于我的情况

来自分类Dev

左右箭头键不适用于我

来自分类Dev

.htaccess重写规则不适用于我

来自分类Dev

z索引不适用于我的动画

来自分类Dev

该数组不适用于我的图片输出

来自分类Dev

Bootstrap 4列系统不适用于我