建设者的设计模式不适合我
Builder design pattern does not work for me
我刚写的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;
};
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 资源管理设计模式
- 用于在回调中调用解析器的设计模式
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 在这种情况下我应该使用哪种设计模式
- C++中物体改变识别的设计模式?
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 适合事件管理的设计模式
- 在x86_64模式下,64 位数字不适合寄存器整数
- 如果 Proactor 设计模式优于异步 I/O,为什么它在 ASIO 中不是默认值?
- C++ 装饰设计模式 - 代码有效但不知道为什么
- Decorator设计模式:为什么调用链中的函数而不调用循环中的函数
- 是否有自定义内存分配器设计模式不在其分配中存储元数据
- 用于在不使用 RTTI 的情况下缓存不同派生类型的设计模式
- 如何在不使用非构造函数的方法的情况下应用singleton设计模式来返回类对象
- 建设者的设计模式不适合我
- 不是全局单例设计模式
- 设计模式-是否有一个有效的案例可以创建一个立即被销毁且不直接在C++中使用的临时模式
- 状态设计模式 - 不想删除成员类中的此指针
- 关于设计模式和高级编程的好书,而不是头优先