如何使用C ++中的Builder模式返回类的实例?

问题描述 投票:0回答:1

我正在尝试创建一个简单的纸牌游戏。目的是对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();


}
};

但是不幸的是,这不起作用,我可能误解了*运算符的目标。谢谢。

c++ pointers design-patterns builder
1个回答
0
投票

您没有误解*运算符(至少我不认为)。

此行将不会编译

card1 = *cardGenerator.constructCard(&cardType1Builder); 

这是因为cardGeneratorautomatic对象,而不是指针。在C ++中,对象可以构造为自动或动态对象。在自动对象的生命周期受其范围管理的情况下,动态对象会一直存在,直到手动删除(或您的程序停止执行)并通过指针进行访问。只需从*中删除cardGenerator,它就可以编译并正常运行。

附带说明:int是C ++中的基本类型,这意味着您应按值而不是按引用传递它(特别是因为在某些系统上int实际上小于指针(引用只是const指针) ))

© www.soinside.com 2019 - 2024. All rights reserved.