gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:46:51 24 4
gpt4 key购买 nike

我刚写的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com