大 3 - 赋值运算符

Big 3 - Assignment operator

本文关键字:赋值运算符      更新时间:2023-10-16

我正在开发一个二十一点游戏。在我的二十一点游戏中,我创建了一个名为Dealer的类。我在类中添加了"Big 3",因为我正在使用堆上的资源。在我的 int main() 中,我创建了两个 Dealer 类型的指针并将其设置为彼此;但是,由于某种原因,当我运行调试器时,它不会转到我在 Dealer 类中创建的分配运算符。谁能教育我为什么它不转到在经销商类中创建的分配运算符?为什么赋值运算符仅适用于 Dealer 类型的非指针变量?

class Dealer
{
public:
    Dealer();
    Dealer(Deck*);
    Dealer& operator=(const Dealer&); // assign operator
    Dealer(const Dealer&); //copy constructor
    ~Dealer();//deconstructor
private:
    vector<Card*> myCards;
    Deck *deckOfCards;
};
Dealer::Dealer()
{
    deckOfCards = new Deck();
}
Dealer::Dealer(Deck *t)
{
    deckOfCards = t;
}
//copy constructor
Dealer::Dealer(const Dealer& rightSide)
{
    deckOfCards = new Deck();
    for (size_t x= 0; rightSide.myCards.size(); x++)
    {
        myCards[x] = rightSide.myCards[x];//copying of the vector
    }
}
//Assignment Operator
Dealer& Dealer::operator=(const Dealer& rhs)
{
    if(this != &rhs)
    {
        delete deckOfCards;
        for(size_t x = 0; x < myCards.size(); x++)
        {
            delete [] myCards[x];
        }
        myCards.clear();
        deckOfCards = rhs.deckOfCards; //copy for Deck *deckOfCards
        for (size_t x= 0; rhs.myCards.size(); x++)
        {
            myCards[x] = rhs.myCards[x];//copying of the vector
        }    
    }
    return *this;
 }
//Destructor
Dealer::~Dealer()
{
     delete deckOfCards;
    for(size_t x = 0; x < myCards.size(); x++)
    {
        delete [] myCards[x];
    }
    myCards.clear();     
}
int main()
{
    Deck* p = new Deck();
    Deck *b = new Deck();
    p->shuffle();
    p->Display();    
    b = p; //does not apply the assign operator
    b->Display();
    b->shuffle();
    b->Display();
//    Deck f;
//    Deck g;  
//    f.shuffle();
//    g = f;  // This goes to the assignment operator function 
//    f.Display();
//    g.shuffle();
//    g.Display();
}

因为赋值方法用于复制(在这个词的松散意义上,从技术上讲,它可能应该是"赋值")一个对象,而不是用于复制指向对象的普通指针。

根据定义,当你复制一个指针时,你希望它指向完全相同的东西,否则它实际上不是副本。因此,您得到的只是对象地址的副本,无需为此调用任何成员函数。