C++ 如何使用C+中的生成器模式返回类的实例+;?
我正在尝试创建一个简单的纸牌游戏。目的是要用C++来更准确地掌握(我现在有java的经验)。特别是,尽管我在网上阅读和观看了无数的材料,但我仍在努力完全理解指针C++ 如何使用C+中的生成器模式返回类的实例+;?,c++,pointers,design-patterns,builder,C++,Pointers,Design Patterns,Builder,我正在尝试创建一个简单的纸牌游戏。目的是要用C++来更准确地掌握(我现在有java的经验)。特别是,尽管我在网上阅读和观看了无数的材料,但我仍在努力完全理解指针 #include "../header_files/Card.h" class Card { public: void setCardName(const string& name){ card_name = name; } void setCardPower(const int&
#include "../header_files/Card.h"
class Card {
public:
void setCardName(const string& name){
card_name = name;
}
void setCardPower(const int& pow){
card_power = pow;
}
void setLuck(const int& luck){
card_luck = luck;
}
void printCardDetails() {
std::cout << "\nCard: " << card_name
<< "Luck: "<< card_luck <<
"Power: " << card_power <<"\n" << std::endl;
}
private:
string card_name;
int card_power;
int card_luck;
};
class CardBuilder{
public: virtual ~CardBuilder() {};
Card* getCard(){
return card.release();
}
void createNewCard(){
card = make_unique<Card>();
}
virtual void setCardName() = 0;
virtual void setCardPower() = 0;
virtual void setCardLuck() = 0;
protected:
unique_ptr<Card> card;
};
class CardType1Builder : public CardBuilder {
public:
virtual ~CardType1Builder() {};
virtual void setCardName(){
card->setCardName("Card Type 1");
}
virtual void setCardPower(){
card->setCardPower(1+ (rand() %10));
}
virtual void setCardLuck(){
card->setLuck(1+ (rand() %5));
}
};
class CardType2Builder : public CardBuilder {
public:
virtual ~CardType2Builder() {};
virtual void setCardName(){
card->setCardName("Card Type 2"); //36
}
virtual void setCardPower(){
card->setCardPower(1+ (rand() %10));
}
virtual void setCardLuck(){
card->setLuck(1+ (rand() %5));
}
};
class CardGenerator {
public:
void printCard() {
cardBuilder->getCard()->printCardDetails();
}
void constructCard(CardBuilder* cb){
cardBuilder = cb;
cardBuilder->createNewCard();
cardBuilder->setCardName();
cardBuilder->setCardPower();
cardBuilder->setCardLuck();
}
private:
CardBuilder* cardBuilder;
};
但不幸的是,它不起作用,我可能误解了*操作符的目的。多谢各位 您没有误解
*
操作符(至少我不这么认为)
这一行无法编译
card1=*cardGenerator.constructCard(&cardType1Builder);
这是因为cardGenerator
是一个自动对象,而不是指针。在C++中,对象可以被构造为自动或动态对象。当自动对象的生存期由其作用域管理时,动态对象存在,直到手动删除(或您的程序停止执行)并通过指针访问。只需从cardGenerator
中删除*
,它就可以正常编译和运行
旁注:<代码> int >代码>是C++中的一种基本类型,这意味着你应该通过值而不是引用来传递(尤其是因为某些系统<代码> int <代码>实际上比指针小(参考只是一个const指针))< /p>什么不起作用?请澄清您的问题,包括实际问题:代码>卡* GETCARD(){RealSoCe();} /Cd>。因为您正在转移所有权,返回类型应该是<代码> STD::UnQuyJPPT< /COD>。C++中的代码> INT/COM>是基本类型,所以通过值而不是引用传递(<代码>和<代码>)Stase= >应该是自动的。你是什么意思?堆和堆栈还是不好的概念在C++中考虑(它们不是语言概念的一部分)。您应该考虑自动和动态存储持续时间对象。自动对象可以出现在java开发人员所称的堆上,但它们也存在于java开发人员所称的堆栈上。这就是为什么最好将它们称为自动对象。这并不限制它们的创建位置,但描述了它们的工作方式。自动对象会自动创建和销毁。动态对象是用
new
创建的,用delete
销毁的,存在于heap和stack中。我明白你的意思,但我认为这只是说同一件事的两种方式。当我说堆时,我并不是说堆中的内存在物理上与堆栈内存不在同一位置,而是说它是以不同的方式分配和释放的。我试图区分java对象(我理解的)是指针和C++对象,但问题不在于它们不一定是相同的。通常是这样。您可能会在整个职业生涯中只使用基于堆栈的自动存储。但事实并非总是如此。另外,这是最重要的一点,自动比单词堆栈更好地描述了正在发生的事情。编程就是描述行为。自动描述行为。堆栈描述了一个实现。它只包含正在发生的事情的隐含信息。
private:
CardGenerator cardGenerator;
CardType1Builder cardType1Builder;
CardType1Builder cardType2Builder;
Card card1;
Card card2;
public:
void generateCards() {
card1 = *cardGenerator.constructCard(&cardType1Builder); //trying to dereference the pointer
cardGenerator.printCard();
card1 cardGenerator.constructCard(&cardType2Builder);
cardGenerator.printCard();
}
};