我正在尝试创建一个简单的纸牌游戏。目的是对C ++有更牢固的掌握(到目前为止,我对Java还是有经验的)。特别是,尽管我在网络上阅读和观看了无数资料,但我仍在努力完全理解这些指针。
#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;
};
现在,我想创建一个由CardBuilder
构建的类的几个实例的Deck类。我特别尝试了以下方法:
班级甲板{
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();
}
};
但是不幸的是,这不起作用,我可能误解了*运算符的目标。谢谢。
您没有误解*
运算符(至少我不认为)。
此行将不会编译
card1 = *cardGenerator.constructCard(&cardType1Builder);
这是因为cardGenerator
是automatic对象,而不是指针。在C ++中,对象可以构造为自动或动态对象。在自动对象的生命周期受其范围管理的情况下,动态对象会一直存在,直到手动删除(或您的程序停止执行)并通过指针进行访问。只需从*
中删除cardGenerator
,它就可以编译并正常运行。
附带说明:int
是C ++中的基本类型,这意味着您应按值而不是按引用传递它(特别是因为在某些系统上int
实际上小于指针(引用只是const指针) ))