2011-12-25 2 views
0

이전 질문에서 벗어나는 문제를 기반으로 : vector::erase with pointer member, Remove elements of a vector inside the loop, 여전히 vector.erase 기능에 대한 도움이 필요합니다. 나는 복사 생성자를 구현하여 벡터에서 지우기 기능을 작동하도록 지시 받았는데, 이는 다른 질문에서도 언급되어있다. 관련 클래스에 함수 연산자를 구현하는 것이 중요합니다. 이렇게하면 복사 생성자를 만드는 데 또 다른 오류가 발생하며 오랫동안 이유를 찾을 수 없습니다. 오류 : "Player :: Player (const player & otherPlayer)가 다음과 같은 초기화 프로그램을 제공하지 않습니다." 내가 도대체 ​​뭘 잘못하고있는 겁니까? 플레이어가 클래스 멤버로지도, 포인터 및 참조 (은행 참조)가 포함되어 있음을 고려하십시오. 간단한 할당이 초기화에 적합한가?벡터 지우기 기능을위한 복사 생성자 구현

어떻게해야합니까?

class Player 
{ 
public: 
Player(int,int,string, Bank&); 
Player(const Player&); 
Player& operator = (const Player& rhs); 


Player::Player(const Player& otherPlayer) 
{ 
ID = otherPlayer.ID; 
pName = otherPlayer.pName; 
pMoney = otherPlayer.pMoney; 
doubleIndicator = otherPlayer.doubleIndicator; 
position = otherPlayer.position; 
bank = otherPlayer.bank; 
colBought = otherPlayer.colBought; 
housesColBuilt = otherPlayer.housesColBuilt; 

} 

업데이트 : 내가 같이 = 연산자의 implementantion의 시점에서 경고를 얻을 : "로컬 변수 또는 임시의 주소를 반환". 이것이 실제 문제를 유발합니까? 그렇다면 이것을 극복하기 위해 어떻게 수정할 수 있습니까?

Player& Player::operator=(const Player& rhs) 
{ 
*this = Player(rhs); 
return *this; 
} 

모든 힌트 :

이런 식으로
Player& Player::operator=(const Player& rhs) 
{ 
return Player(rhs); 
} 

, 나는 여전히 재귀 함수 스택 오버 플로우가 발생할 수 있다는 경고가?

+0

Re : 업데이트. 예, 그것이 진짜 문제입니다. 1) 과제를 수행하지 않습니다. 2) 잘못된 개체에 대한 참조를 반환합니다. (반환 값은 다른 목적이 있다고 생각되면 연결을 허용하는 것입니다.) – UncleBens

+0

어떤 종류의 배정이 필요합니까? 그런데 복사 생성자가 필요한 이유는 무엇입니까? 모든 작업을 operator = 함수 내에서 수행 할 수 있습니까? – arjacsoh

답변

3

당신은 생성자에서 멤버 이니셜 라이저와 클래스의 멤버 참조를 초기화해야합니다

Player::Player(const Player& otherPlayer) : 
    bank(otherPlayer.bank) 
{ 
    //... 
} 

그렇지 않으면 참조가 허용되지 않는, 초기화되지 않은 것 때문이 필요합니다.

할당 bank = otherPlayer.bank;은 다른 점을 유의하십시오. 참조 자체를 설정하는 것이 아니라 참조되는 객체를 할당합니다.

동일한 방식으로 다른 구성원을 초기화하는 것도 좋은 방법입니다. 그렇지 않으면 더 최적의 코드로 이어질 수 있습니다 (그렇지 않으면 구성원이 할당되기 전에 기본 구성 될 수 있음).

+0

그리고 다른 모든 것들은 같은 방법으로 초기화 될 수 있습니다. – Mat