Скопируйте конструктор и оператор присваивания - PullRequest
0 голосов
/ 12 августа 2011

Вот фрагмент кода:

class GameBoard
{
    public:
    GameBoard() { cout<<"Gameboard()\n"; }
    GameBoard(const GameBoard&)
    {
        cout<<"GameBoard(const GameBoard&)\n";
    }

    GameBoard& operator=(const GameBoard&)
    {
        cout<<"GameBoard& operator=(const GameBoard&)\n";
        return *this;
    }
    ~GameBoard() { cout<<"~GameBoard()\n";};
};    

class Game
{
    GameBoard gb;
    public:
    Game(){ cout<<"Game()\n"; }
    Game(const Game&g):gb(g.gb)
    {
        cout<<"Game(const Game&g)\n";
    }
    Game(int) {cout<<"Game(int)\n"; }
    Game& operator=(const Game& g)
    {
        gb=g.gb;
        cout<<"Game::operator=()\n";
        return *this;
    }
    class Other
    {
        public:
        Other(){cout<<"Game::Other()\n";}
    };
    operator Other() const
    {
        cout<<"Game::Operator Other()\n";
        return Other();
    }
    ~Game() {cout<<"~Game()\n";}
};  

class Chess: public Game {};

void f(Game::Other) {}

class Checkers : public Game
{
    public:
    Checkers() {cout<<"Checkers()\n";}
    Checkers(const Checkers& c) : Game(c)
    {
        cout<<"Checkers(const Checkers& c)\n";
    }
    Checkers operator=(const Checkers& c)
    {
        Game::operator=(c);
        cout<<"Checkers operator=(const Checkers& c)\n";
        return *this;
    }
}; 

int main()
{
    Chess d1;
    Chess d2(d1);
    d1=d2;
    f(d1);
    Game::Other go;
    Checkers c1,c2(c1);
    c1=c2;
}

Вот вывод

Gameboard()                        //Constructing d1
Game()
GameBoard(const GameBoard&)
Game(const Game&g)                 //d2(d1)
GameBoard& operator=(const GameBoard&)
Game::operator=()                  //d1=d2
Game::Operator Other()             //f(d1)
Game::Other()
Game::Other()                      //go             
Gameboard()                        //c1
Game()
Checkers()
GameBoard(const GameBoard&)        //c2(c1)
Game(const Game&g)
Checkers(const Checkers& c)
GameBoard& operator=(const GameBoard&)    //c1=c2
Game::operator=()
Checkers operator=(const Checkers& c)
GameBoard(const GameBoard&)               ?
Game(const Game&g)                        ?
Checkers(const Checkers& c)               ?
~Game()
~GameBoard()
~Game()
~GameBoard()
~Game()
~GameBoard()
~Game()
~GameBoard()
~Game()
~GameBoard()

Мой вопрос: почему вызывается последний набор конструкторов копирования?

Ответы [ 2 ]

5 голосов
/ 12 августа 2011

Поскольку ваш оператор присваивания для Checkers возвращает значение вместо ссылки, как обычно.

3 голосов
/ 12 августа 2011
Checkers operator=(const Checkers& c)

должно быть

Checkers& operator=(const Checkers& c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...