C++ 如何使用C+中的生成器模式返回类的实例+;?

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&

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

但不幸的是,它不起作用,我可能误解了*操作符的目的。多谢各位

您没有误解
*
操作符(至少我不这么认为)

这一行无法编译

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();


}
};