2016-11-26 6 views
1

を初期化していない限り、私はゲームと呼ばれるクラスを持って働いていないのオーバーロード、これはそれのコードは、演算子=ですされています演算子は=オブジェクトがすでに

Game& Game::operator=(const Game &other){ 
if(this==&other){ 
    return *this; 
}else{ 
    for(unsigned i=0;i<other.players.size();i=i+1){ 
     Player* copy; 
     int str= other.players.at(i)->getStr(); 
     if(str==1) 
      copy = new PlayerType1(dynamic_cast<const PlayerType1&>(*other.players.at(i))); 
     if(str==2) 
      copy = new PlayerType2(dynamic_cast<const PlayerType2&>(*other.players.at(i))); 
     if(str==3) 
      copy = new PlayerType3(dynamic_cast<const PlayerType3&>(*other.players.at(i))); 
     if(str==4) 
      copy = new PlayerType4(dynamic_cast<const PlayerType4&>(*other.players.at(i))); 
     players.push_back(copy); 
    } 
    winners = other.winners; 
    state = vector<string>(other.state); 
    deck = Deck(other.deck); 
    verbal = other.verbal; 
    highestNum = other.highestNum; 
    turnNum = other.turnNum; 
    currPlayer = other.currPlayer; 
    lastAsker = other.lastAsker; 
    lastAskee = other.lastAskee; 
    lastAskedCard = other.lastAskedCard; 
    return *this; 
} 

}

そして、私はここでそれを呼び出すようにしてみてください。

char* cf= "../src/config1.txt"; 
Game* game = new Game(cf); 
game->init(); 
Game game2=*game; 
game->play(); 
game2.printState(); 

この場合、my演算子=は使用されません。 game2がすでに初期化された場合 しかし、ここでは例えば:

Game* game = new Game(cf); 
game->init(); 
Game game2=*(new Game()); 
game2=*game; 
game->play(); 
game2.printState(); 

任意のアイデア何の問題だろうか?

答えて

1

最初のケースでは、copy elisionは、コピーコンストラクタを優先して代入演算子が呼び出されないようにします。

2番目のケースでは、オブジェクトはすでに作成されているため、代入演算子を呼び出す必要があります。

結論として、デストラクタ、割り当て、およびコピー(別名rule of threeと呼ばれます)の3つの演算子をすべて実装する必要があります。そうしないと、コンパイラによって予測できない動作が発生する可能性があります。

そして、一貫性のない方法でそれらを実装する回避する最善の方法は問題だったcopy & swap idiom

+0

感謝を:)使用することです! – Dolav