C++ 复制构造函数不';不要复制参考资料

C++ 复制构造函数不';不要复制参考资料,c++,C++,根据话题 全班: class Invader { public: Invader(const Invader&other); Invader(); ~Invader(); public: void Init(InvaderTypes invadertype, CIw2DImage *AlienImage); void Update(float dt); void R

根据话题

全班:

  class Invader
    {
    public:
        Invader(const Invader&other);
        Invader();
        ~Invader();
    public:
        void Init(InvaderTypes invadertype, CIw2DImage *AlienImage);
        void Update(float dt);
        void Render();
        void SetAlienImage(CIw2DImage *image){ mImageAlien = image; }

        void        setVisible(bool show)       { Visible = show; }
        bool        isVisible() const           { return Visible; }


        Iw2DSceneGraph::CSprite         *AlienSprite;
        Iw2DSceneGraph::CAtlas          *AlienAtals;
        CIw2DImage                      *mImageAlien;
        std::list<Bullet*>              *Bullets;
        CIwFMat2D                       Transform;              // Transform matrix

        bool                             Visible;                // Sprites visible state
        bool                             Canfire;
    };


Invader::Invader()
{

}

Invader::Invader(const Invader&other)
{       // Create EnemyTop atlas
    AlienAtals = new CAtlas();
    AlienSprite = new CSprite();

    *AlienAtals = *other.AlienAtals;
    *AlienSprite = *other.AlienSprite;
}

Invader::~Invader()
{
    for (std::list<Bullet*>::iterator it = Bullets->begin(); it != Bullets->end(); ++it)
        delete *it;

    delete Bullets;
    delete AlienAtals;
    delete AlienSprite;
}


void Invader::Init(InvaderTypes invadertype, CIw2DImage *AlienImage)
{
    if (invadertype == InvaderTypes::TOP_ALIEN)
    {
        //SetAlienImage(AlienImage);
        mImageAlien = AlienImage;
        // Create EnemyTop atlas
        int frame_w = (int)(mImageAlien->GetWidth() / 2);
        int frame_h = (int)(mImageAlien->GetHeight());
        AlienAtals = new CAtlas(frame_w, frame_h, 2, mImageAlien);
        AlienSprite = new CSprite();
        AlienSprite->m_X = 0;
        AlienSprite->m_Y = 0;
        AlienSprite->SetAtlas(AlienAtals);
        AlienSprite->m_W = (float)AlienAtals->GetFrameWidth();
        AlienSprite->m_H = (float)AlienAtals->GetFrameHeight();
        AlienSprite->m_AnchorX = 0.5;
        AlienSprite->SetAnimDuration(2);
    }
    else if (invadertype == InvaderTypes::MIDDLE_ALIEN)
    {

    }
    else if (invadertype == InvaderTypes::LAST_ALIEN)
    {

    }


    Visible = true;
    Bullets = new std::list<Bullet*>();
    Canfire = true;
}
类入侵者
{
公众:
入侵者(const入侵者和其他);
入侵者();
~入侵者();
公众:
void Init(入侵类型入侵类型,CIw2DImage*AlienImage);
无效更新(浮动dt);
void Render();
void SetAlienImage(CIw2DImage*image){mImageAlien=image;}
void setVisible(bool show){Visible=show;}
bool isVisible()常量{return Visible;}
Iw2DSceneGraph::CSprite*AlienSprite;
Iw2DSceneGraph::CAtlas*疏远;
CIw2DImage*mImageAlien;
std::列表*项目符号;
CIwFMat2D变换;//变换矩阵
bool Visible;//精灵可见状态
布尔坎菲尔;
};
入侵者::入侵者()
{
}
入侵者::入侵者(常量入侵者和其他)
{//创建EnemyTop atlas
疏远=新的卡特拉斯();
AlienSprite=new CSprite();
*疏远=*其他疏远;
*AlienSprite=*other.AlienSprite;
}
入侵者::~入侵者()
{
对于(std::list::iterator it=Bullets->begin();it!=Bullets->end();++it)
删除*它;
删除项目符号;
删除疏远语;
删除AlienSprite;
}
无效入侵者::Init(入侵者类型入侵者类型,CIw2DImage*AlienImage)
{
if(investrType==investrTypes::TOP\u ALIEN)
{
//SetAlienImage(AlienImage);
mImageAlien=AlienImage;
//创建EnemyTop地图册
int frame_w=(int)(mImageAlien->GetWidth()/2);
int frame_h=(int)(mImageAlien->GetHeight());
异化=新的CAtlas(框架w,框架h,2,mImageAlien);
AlienSprite=new CSprite();
AlienSprite->m_X=0;
AlienSprite->m_Y=0;
AlienSprite->SetAtlas(异化);
AlienSprite->m_W=(float)异化->GetFrameWidth();
AlienSprite->m_H=(float)疏离->GetFrameHeight();
AlienSprite->m_AnchorX=0.5;
AlienSprite->SetAnimDuration(2);
}
else if(investrType==investrTypes::MIDDLE\u ALIEN)
{
}
else if(investrType==investrTypes::LAST_ALIEN)
{
}
可见=真实;
项目符号=新标准::列表();
Canfire=正确;
}
我通过执行以下操作添加了对象:

  list<Invader> invaders;

    int spacing = 10;
    for (int i = 0; i < 5; i++)
    {
        Invader invader;
        invader.Init(TOP_ALIEN, gameResources->getAlienImageTop());
        invader.AlienSprite->m_X = 50 + spacing;
        invaders.push_back(invader);
        spacing += 50;
    }
列出入侵者;
整数间距=10;
对于(int i=0;i<5;i++)
{
侵略者;
Init(TOP_ALIEN,gameResources->getAlienImageTop());
入侵者.AlienSprite->m_X=50+间距;
入侵者。推回(入侵者);
间距+=50;
}
用法:现在它在访问(it)时导致访问冲突

for(list::iterator it=invaders.begin();it!=invaders.end();it++)
{
(it)->更新(帧时间);
(it)->Render();
}
您可以在下图中看到结果:

首先,在
入侵者::Init())
期间,您提供指向
AlienImage
的指针副本。然后,当您将对象复制到
std::list
中时,不会将同一指针复制到新对象。此外,在
Invader::Invader(const Invader&other)
期间,您没有复制
Invader::Bullets
。这使得两个值都未初始化,导致访问时出现未定义的行为(可能发生在
(it)->Update(FRAME_TYIME);
和/或
(it)->Render()中)
--我无法验证,因为您没有提供。

此代码中的任何地方都没有调用
入侵者
复制构造函数。如果在
入侵者
中未初始化某些内容,那是因为默认构造函数或
Init()
未初始化它。@Barry The Init()是否初始化它,我可以看到所有指针都已初始化,然后再将其推到列表中。这是调试版本还是发布版本?发布版本有时会混淆调试器。@andreahmed这不会改变您没有显示任何使用复制构造函数的代码的事实。这意味着,复制构造函数所做的与此无关。@andreahmedhmed:请编辑您的帖子,使其包含-您只显示了其中的一小部分。非常感谢。第一个问题的解决方案是什么?我不知道。我需要加载一次图像。我提到的第一个问题不正确,我误读了您的一行删除内容。但您仍然没有在副本c中复制指向图像的指针onstructor是您最可能的未定义行为来源(同样,按照其他人的要求生成MCVE)如何复制图像指针?我应该这样做吗?*mImageAlien=*other.mImageAlien;在复制ctr中?是的,完全正确。这会复制指针,但不会复制对象本身。这确保
mImageAlien
没有垃圾值(除非您
在某个地方删除mImageAlien
,并且不使用相同的值更新所有指针!)
 for (list<Invader>::iterator it = invaders.begin(); it != invaders.end(); it++)
            {
                (it)->Update(FRAME_TIME);
                (it)->Render();
            }