用户定义复制ctor,以及copy-ctors进一步向下 - 编译器错误?程序员脑力劳动?

时间:2010-03-08 07:52:50

标签: c++ compiler-construction

我有一点问题,我不确定这是编译器错误,还是我的愚蠢。 我有这个结构:

struct BulletFXData
{
 int time_next_fx_counter;
 int next_fx_steps;
 Particle particles[2];//this is the interesting one
 ParticleManager::ParticleId particle_id[2];
};

成员“粒子粒子[2]”中有一种自制的smart-ptr(资源计数纹理类)。这个智能指针有一个默认的构造函数,初始化为ptr为0(但这并不重要)

我还有另一个包含BulletFXData结构的结构:

struct BulletFX
{
 BulletFXData     data;
 BulletFXRenderFunPtr   render_fun_ptr;
 BulletFXUpdateFunPtr   update_fun_ptr;
 BulletFXExplosionFunPtr  explode_fun_ptr;
 BulletFXLifetimeOverFunPtr  lifetime_over_fun_ptr;

 BulletFX( BulletFXData     data,
    BulletFXRenderFunPtr   render_fun_ptr,
    BulletFXUpdateFunPtr   update_fun_ptr,
    BulletFXExplosionFunPtr  explode_fun_ptr,
    BulletFXLifetimeOverFunPtr  lifetime_over_fun_ptr)
 :data(data),
 render_fun_ptr(render_fun_ptr),
 update_fun_ptr(update_fun_ptr),
 explode_fun_ptr(explode_fun_ptr),
 lifetime_over_fun_ptr(lifetime_over_fun_ptr)
 {
 }
/*
 //USER DEFINED copy-ctor. if it's defined things go crazy
     BulletFX(const BulletFX& rhs)
     :data(data),//this line of code seems to do a plain memory-copy without calling the right ctors
     render_fun_ptr(render_fun_ptr),
     update_fun_ptr(update_fun_ptr),
     explode_fun_ptr(explode_fun_ptr),
     lifetime_over_fun_ptr(lifetime_over_fun_ptr)
     {
     }
    */
    };

如果我使用用户定义的copy-ctor,我的智能指针类会变得疯狂,似乎调用CopyCtor /赋值运算符并不会调用它们。 那么 - 这一切都有意义吗?似乎我自己的struct BulletFX的copy-ctor应该完全按照编译器生成的那样做,但它似乎忘记在链中调用正确的构造函数。 编译bug?我是傻瓜?

对于大代码感到抱歉,一些小例子也可以说明。但是经常你们要求真正的代码,所以很好 - 这就是:D

编辑:更多信息:

typedef ParticleId unsigned int; 

Particle没有用户定义的复制器,但其成员类型为:

Particle
{
    ....
    Resource<Texture>  tex_res;
    ...
}

资源是一个智能指针类,并且已经定义了所有ctor(也是asignment运算符) 并且看起来资源是按位复制的。

编辑:
亨利克解决了......数据(数据)当然是愚蠢的!它当然应该是rhs.data !!!
对不起大量的代码,其中有一个很小的错误!
(猜猜你不应该在早上1点编码:D)

2 个答案:

答案 0 :(得分:0)

:data(data)

这是有问题的。这是因为您的BulletFXData结构没有自己的copy-ctor。你需要定义一个。

答案 1 :(得分:0)

有两件事突然袭来我:

  1. 这是编译器错误吗? 不,它永远不是编译器错误。二十年来,我见过enumerus投诉,
    '它必须是一个编译器错误'只有一个曾经证明是一个错误和那种方式 回到gcc 2.95(现在gcc非常稳定(就像开发工作室))'
  2. 我建立了自己的智能指针 它是一个很好的概念和良好的学习经验。但实在是太难了 比你想象的要正确。特别是当你似乎遇到麻烦时 复制构造函数
  3. 这是错误的结构是使用自身作为要复制的对象构造的副本。因此,您将随机数据复制到自身。

    :查看评论以了解您应该将哪些用作参数。

    //USER DEFINED copy-ctor. if it's defined things go crazy
     BulletFX(const BulletFX& rhs)
     :data(data),                                   // rhs.data
     render_fun_ptr(render_fun_ptr),                // rhs.render_fun_ptr
     update_fun_ptr(update_fun_ptr),                // rhs.update_fun_ptr
     explode_fun_ptr(explode_fun_ptr),              // rhs.explode_fun_ptr
     lifetime_over_fun_ptr(lifetime_over_fun_ptr)   // rhs.lifetime_over_fun_ptr
     {
     }
    

    当然,此时你也可以使用编译器生成的拷贝构造函数版本,因为这正是它正在做的事情。