2014-11-28 3 views
0

나는 블랙 잭 게임을 개발하고있다. 내 블랙 잭 게임에서 딜러라는 수업을 만들었습니다. 나는 힙에 리소스를 사용하고 있기 때문에 클래스에 "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(); 
} 
+0

* "빅 3"에 추가했습니다. * 3 규칙입니까? 또한 [0의 규칙]을 고려하십시오 (http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html) – Borgleader

+0

예, 3의 규칙. 그것은 또한 거의 교과서 "빅 3"에서 정의됩니다. – user2233096

+0

@ user2233096 FYI - 할당 연산자의 훨씬 더 쉬운 버전입니다 :'Dealer & Dealer :: operator = (Dealer rhs) {std :: swap (rhs.deckOfCards, deckOfCards); std :: swap (rhs.myCards, myCards); return * this; }'이것은 데이터와 달리 포인터를 복사하는 것과 관련된 모든 문제를 해결합니다. – PaulMcKenzie

답변

1

는하지 개체에 일반 포인터를 복사에 대한 객체 (단어의 느슨한 의미에서, 기술적으로는 아마 '할당'해야한다).

정의를하면 포인터가 복사 될 때 은 정확히 동일한 것을 가리키는을 가리키고, 그렇지 않으면 실제로는 복사되지 않습니다. 그래서, 당신이 얻는 것은 당신의 객체의 주소의 복사본입니다. 그것에 대한 어떤 멤버 함수도 호출 할 필요가 없습니다.