2016-11-26 82 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(); 

在这种情况下,我的operator =不会被使用。 但如果GAME2已初始化,例如这里:

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

任何想法可能是什么问题?

回答

1

在第一种情况下,copy elision可避免调用赋值运算符,以支持复制构造函数。

在第二种情况下,对象已经建好,所以必须调用赋值操作符。

结论是,您必须实现所有3个运算符:析构函数,赋值和复制(也称为rule of three),否则根据编译器的不同,您可能会有不可预知的行为。

,并避免不一致的方式实现他们的最好方法是使用copy & swap idiom

+0

谢谢:)这是问题! – Dolav