【问题标题】:C++ copy objectC++ 复制对象
【发布时间】:2019-01-24 13:54:33
【问题描述】:

我有一个类Game,其中包含另一个对象GameGrid

游戏.h

class Game
{
        public:
            Game(uint32_t GridSize);
        private:
            GameGrid _CurrentGrid;
}

游戏.cpp

Game::Game(uint32_t GridSize) : _CurrentGrid(GridSize)
{
}

GameGrid.h

class GameGrid
{       
        public:
            GameGrid(uint32_t GridSize);
            void setGrid(const Grid& Grid);
            const GameGrid::Grid getGrid(void) const;
        private:
            Grid _Grid;
}

GameGrid.cpp

GameGrid::GameGrid(uint32_t GridSize)
{
    uint32_t i = 0;
    uint32_t j = 0;

    _Grid.assign(GridSize, std::vector<unsigned int>(GridSize));

    for (i = 0; i < GridSize; i++)
    {
        for (j = 0; j < GridSize; j++)
        {
            _Grid.at(i).at(j) = 0;
        }
    }
}

void GameGrid::setGrid(const GameGrid::Grid& Grid)
{
    _Grid = Grid;
}

const GameGrid::Grid GameGrid::getGrid(void) const
{
    return _Grid;
}

现在我有了我的应用程序,它使用了游戏类

Game* MyGame = new Game(4);

如何为这个指向游戏对象的指针创建一个复制函数,以便我可以克隆该对象。

我已经用赋值运算符试过了

Game& operator=(Game const& Ref);

Game& Game::operator=(Game const& Ref)
{
    if (&Ref != this)
    {
        this->~Game2048();
        new (this) Game2048(Ref);
    }

    return *this;
}

但是这个解决方案不起作用,当我更改克隆时,我的原始对象也发生了变化。

有人给我提示吗?

谢谢!

【问题讨论】:

  • 您将克隆设置为对原始网格的引用,这就是您看到它更改原始网格的原因。如果您需要复制原件但保护原件不被更改,请按值复制而不是引用。
  • 1) 为什么需要在显示的代码中使用指针? 2)复制构造函数用于复制对象..
  • 'Game2048' 在 Game.h 中无效,可能是拼写错误,请编辑
  • 我感觉你所有的问题都是从使用new 开始的。你为什么使用 new ?编译器生成的拷贝构造函数有什么问题?
  • this-&gt;~Game2048(); 这一行对我来说非常可疑,实际上应该永远不必直接调用析构函数,更不用说this

标签: c++


【解决方案1】:

我同意@SombreroChicken 所说的话。

我只想指出深拷贝和浅拷贝的区别。

如果你的类包含一些指针作为私有成员数据,你必须知道,只有指针被复制,而不是被指向的数据。 Here 很好地深入解释了我所说的。

【讨论】:

    【解决方案2】:

    不要自己创建复制构造函数,让编译器为你做,然后只使用对象:

    Game MyGame{4};
    Game gameClone = MyGame;
    

    这里没有理由使用原始指针。

    【讨论】:

    • 我只想说,您的用户资料有一个很棒的图标。草帽鸡!!太棒了。
    • @RyanWilson 谢谢 :)
    • 谢谢小鸡 :) 我坚持使用指针处理,所以我把它们扔掉,不用指针。
    • @Kampi 如果没有必要,以后不要使用指针。永远不要使用new。使用智能指针、向量或对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    相关资源
    最近更新 更多