C++ 使用指针强制转换到对象

C++ 使用指针强制转换到对象,c++,C++,我有一个类,Fixture,我想将其转换为第三方库类,b2FixtureDef。目前,我的函数如下所示: Fixture::operator b2FixtureDef() const { b2FixtureDef fd; fd.density = m_density; fd.friction = m_friction; fd.isSensor = m_isSensor; fd.restitution = m_restitution; fd.shap

我有一个类,
Fixture
,我想将其转换为第三方库类,
b2FixtureDef
。目前,我的函数如下所示:

Fixture::operator b2FixtureDef() const {
    b2FixtureDef fd;
    fd.density = m_density;
    fd.friction = m_friction;
    fd.isSensor = m_isSensor;
    fd.restitution = m_restitution;
    fd.shape = &b2PolygonShape(m_polygon); // <-- the problem
    return fd;
}
Fixture::operator b2FixtureDef() const {
    b2FixtureDef fd;
    fd.density = m_density;
    fd.friction = m_friction;
    fd.isSensor = m_isSensor;
    fd.restitution = m_restitution;
    fd.shape = new b2PolygonShape(m_polygon);
    return fd;
}
void Body::addFixture(const Fixture& fixture) {
    m_fixtures.append(fixture);
    b2FixtureDef fd = fixture;
    m_body->CreateFixture(&fd);
    delete fd.shape;
}
然后像这样使用:

Fixture::operator b2FixtureDef() const {
    b2FixtureDef fd;
    fd.density = m_density;
    fd.friction = m_friction;
    fd.isSensor = m_isSensor;
    fd.restitution = m_restitution;
    fd.shape = &b2PolygonShape(m_polygon); // <-- the problem
    return fd;
}
Fixture::operator b2FixtureDef() const {
    b2FixtureDef fd;
    fd.density = m_density;
    fd.friction = m_friction;
    fd.isSensor = m_isSensor;
    fd.restitution = m_restitution;
    fd.shape = new b2PolygonShape(m_polygon);
    return fd;
}
void Body::addFixture(const Fixture& fixture) {
    m_fixtures.append(fixture);
    b2FixtureDef fd = fixture;
    m_body->CreateFixture(&fd);
    delete fd.shape;
}

我的目标是,我可以直接进入
m_body->CreateFixture(&fixture)
,它将
fixture
转换为
b2FixtureDef
,并自行释放资源。。。但是,如果这个愚蠢的指针悬而未决,这看起来是不可能的。

只要您的类派生自它们的类,这就不是问题。就C++而言,指针是指针。它指向的是堆还是堆栈分配并不重要。但是,如果它们不在同一继承层次结构中,那么它将不起作用。

是的,看起来您正在构造一个临时的
b2PolygonShape
,获取该文件的地址并将其存储在
fd.shape
成员中,因此这是一个问题-它确实会变得无效

给定
fd.shape
是一个指针,它可能会指向堆上分配的东西(没有包装器)。那么
夹具
多边形
对象的普通生命周期是什么


看起来您正在包装自己的多边形对象
m_polygon
,并返回该对象。那么,您不能在包含对象中创建自己的
b2PolygonShape
(作为m_polygon旁边的成员)并返回指向该对象的指针吗?然后,生命周期将与原始多边形及其来源的对象相同。这样,即使您在堆上分配了
b2PolygonShape
,也可以在包装类的析构函数中清理它。

在您的情况下,堆分配似乎是唯一的方法。您必须考虑谁拥有该对象的所有权,并让它负责以后删除该对象。

转换运算符始终必须复制所有内容,以便即使原始对象被释放,结果仍然有效。这意味着您需要将
m_polygon
复制为b2PolygonShape,并将指向它的指针指定给b2FixtureDef::shape

您可以通过在b2PolygonShape中实现复制构造函数或在任何类型的
m_polygon
中实现转换运算符来创建复制。[……]

b2FixtureDef::shape看起来像一个has-a关系,所以b2FixtureDef的析构函数无论如何都应该释放它,不是吗


嗯,您说b2FixtureDef::shape不是自动释放的,如果您创建了一个代理类,该类的成员是b2FixtureDef,转换操作符是b2FixtureDef,该怎么办

当您创建代理对象时,您将在堆上创建b2PolygonShape,并像在代码中一样填充b2FixtureDef成员。在转换运算符中,您只需返回b2FixtureDef成员,并在代理析构函数中释放b2PolygonShape:

class FixtureProxy
{
  b2FixtureDef m_Fixture;
  FixtureProxy(Fixture aFixture) {m_Fixture.Shape = new b2PolygonShape(aFixture.m_polygon);...}
  ~FixtureProxy() {delete m_Fixture.Shape}
  operator b2FixtureDef() const {return m_Fixture}
}
然后你就这样使用它

void Body::addFixture(const Fixture& fixture) {
    m_fixtures.append(fixture);
    m_body->CreateFixture(&b2FixtureDef(FixtureProxy(fixture)));
}

他返回一个对象,该对象保存指向临时对象(在堆栈上分配)的指针。对象一离开,
fd.shape
指针就会失效。因此,获取堆栈分配对象的地址可能是危险的。啊,错误地认为示例的一部分没有意识到他没有正确地控制对象的生命周期。好吧,就像我说的,那么我基本上有两个相同数据的副本,我更愿意避免。你的多边形对象不是从它们派生出来的吗?否则,指针将不兼容(例如vtable布局、数据成员等)。假设他们是,你已经在共享存储了。不。。。没有。我实际上在与两个第三方库合作。。。一个是相当干净和完善的(Qt),另一个仍在经历快速变化(Box2D)。我选择从Qt继承,而不是从Box2D继承,这样我就不会有所有内部数据的两个副本,而是添加一个操作符来执行转换。因此,我将多边形转换为Box2D想要的类型。嗯。。我无法更改
fd.shape
的类型。您不能将智能指针分配给常规旧指针。。。。你能吗?对不起,我刚刚意识到我自己:我修改了我的答案。我想我的另一个物体可以把它清理干净。。。我想会破坏一些封装,但是。。。它可能是邪恶中较小的一种。
m_polygon
属于
polygon
(我自己的职业)。它确实有一个转换操作符,这就是为什么我可以这样强制转换它,而且它确实复制了所有元素,所以b2PolygonShape可以独立存在。b2FixtureDef不释放任何内容,这是我对这个库感到有点恼火的众多原因之一;和他一起工作很不友好。它实际上只是一个临时对象,用于设置参数以实例化
b2Fixture
。它的预期用途是在堆栈上创建一个b2FixtureDef,将其分配给b2FixtureDef.shape,使用b2Fixture创建一个Fixture,…然后让FixtureDef和b2PolygonDef超出范围,以便在创建Fixture后释放它们(此时它实际被复制,然后允许释放)。错误。。。应该在堆栈上创建b2PolygonDef和b2FixtureDef**我明白了。你觉得我的代理建议怎么样?我们不是在这里兜圈子吗?本质上,我的
Fixture
类已经像您建议的
Proxy
类一样工作了。我当然可以在我的类中存储一个
b2PolygonShape
,而不是一个
Polygon
,但我更喜欢使用
Polygon
,不希望两者都有。看来没什么好办法了。