나는 블랙 잭 게임을 개발하고있다. 내 블랙 잭 게임에서 딜러라는 수업을 만들었습니다. 나는 힙에 리소스를 사용하고 있기 때문에 클래스에 "Big 3"을 추가했습니다. 내 int main()에서 딜러 유형의 포인터 두 개를 만들고 서로 설정했습니다. 그러나 어떤 이유로 디버거를 실행할 때 Dealer 클래스에서 만든 assign 연산자로 이동하지 않습니다. 왜 딜러 클래스에 생성 된 할당 연산자를 사용하지 않는지에 대한 교육을받을 수 있습니까? assign 연산자가 Dealer 유형의 포인터가 아닌 변수에만 작동하는 이유는 무엇입니까? 할당 방법은 복사에 사용되기 때문에빅 3 - 배정 연산자
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();
}
* "빅 3"에 추가했습니다. * 3 규칙입니까? 또한 [0의 규칙]을 고려하십시오 (http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html) – Borgleader
예, 3의 규칙. 그것은 또한 거의 교과서 "빅 3"에서 정의됩니다. – user2233096
@ user2233096 FYI - 할당 연산자의 훨씬 더 쉬운 버전입니다 :'Dealer & Dealer :: operator = (Dealer rhs) {std :: swap (rhs.deckOfCards, deckOfCards); std :: swap (rhs.myCards, myCards); return * this; }'이것은 데이터와 달리 포인터를 복사하는 것과 관련된 모든 문제를 해결합니다. – PaulMcKenzie