我有一点问题,我不确定这是编译器错误,还是我的愚蠢。 我有这个结构:
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)
答案 0 :(得分:0)
:data(data)
这是有问题的。这是因为您的BulletFXData
结构没有自己的copy-ctor。你需要定义一个。
答案 1 :(得分:0)
有两件事突然袭来我:
这是错误的结构是使用自身作为要复制的对象构造的副本。因此,您将随机数据复制到自身。
:查看评论以了解您应该将哪些用作参数。
//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
{
}
当然,此时你也可以使用编译器生成的拷贝构造函数版本,因为这正是它正在做的事情。