如何为Sprite编写复制构造函数?

时间:2018-07-21 12:08:06

标签: c++ sprite copy-constructor

我的代码崩溃了,我想我需要深度复制p_Texture和sprite。 我知道如何制作指向数组的指针的深层副本,但是我不确定如何做到这一点。在这里,我写了这个析构函数:

class Sprite
{
private:
    IDirect3DTexture9* p_Texture;
    LPD3DXSPRITE sprite;
    D3DXVECTOR3 imagepos;
    int m_posX;
    int m_posY;
    int m_posZ;
    int m_width, m_heigth;

public:
    Sprite()
    {
    }

~Sprite()
{
    if (sprite)
    {
        sprite->Release();
        sprite = 0;
    }
    if (p_Texture)
    {
        p_Texture->Release();
        p_Texture = 0;
    }
}

Sprite(std::string path, int posX, int posY, int posZ, int width, int heigth)
{
    m_posX = posX;
    m_posY = posY;
    m_posZ = posZ;
    m_width = width;
    m_heigth = heigth;

    imagepos.x = posX;
    imagepos.y = posY;
    imagepos.z = posZ;

    D3DXCreateTextureFromFileEx(p_Device, path.c_str(), m_width, m_heigth, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT,
        D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &p_Texture)

    D3DXCreateSprite(p_Device, &sprite)
}

void draw()
{
    sprite->Begin(D3DXSPRITE_ALPHABLEND);
    sprite->Draw(p_Texture, NULL, NULL, &imagepos, 0xFFFFFFFF);
    sprite->End();
}

void incPosX(int x) {imagepos.x += x;}
void decPosX(int x) {imagepos.x -= x;}
void incPosY(int x) {imagepos.y += x;}
void decPosY(int x) {imagepos.y -= x;}

float getPosX() { return imagepos.x; }
float getPosY() { return imagepos.y; }

};

但是,由于将其复制到代码中而导致崩溃。

1 个答案:

答案 0 :(得分:0)

复制构造函数的语法为:

Sprite::Sprite(Sprite& other)

然后,您只需将所需的内容从other复制到this指针。

您的代码现在具有隐式复制和移动构造函数。两者都按值复制所有内容。 崩溃的原因很可能是因为在某处进行了Sprite的复制或移动,并且在到期时调用了析构函数。这会释放一些资源,供您以后尝试使用。

您可以通过delete复制和移动构造函数,并查看编译器抱怨的地方找到这些位置。语法如下:

Sprite::Sprite(sprite&  other) = delete; // no copy constructor
Sprite::Sprite(Sprite&& other) = delete; // no move constructor