c++ - 不可能从这个对象继承?

标签 c++ inheritance box2d private-constructor

跟进 this question ,人们建议我选择“选项 3”,它可能看起来像这样:

class b2Body {
private:
    b2Body() {}
    friend class b2World;
};

class Body : public b2Body {
private:
    Body() {}
    friend class World;
};

class b2World {
public:
    b2Body *CreateBody() {
        return new b2Body;
    }
};

class World : public b2World {
public:
    Body *CreateBody() {
        return new Body;
    }
};

int main() {
    World w;
    Body *b = w.CreateBody();
    return 0;
}

Try it online

但这有两个主要问题:

  1. Body 永远无法构造,即使使用 World::CreateBody(因为 b2Body 是私有(private)的)
  2. 即使可以,b2Body 部分也不会正确初始化(b2World::CreateBody 需要 被调用)

这是否意味着我永远不能从 b2Body/b2World 继承并遵循相同的设计模式? (请记住,我无法编辑 b2* 类)

如果是这样,我想你们会建议我只保留 b2Worldb2Body 作为成员变量?


我认为现在归结为这两个选项:

最佳答案

只有 b2World 可以创建一个 b2Body 所以这不会去任何地方。这些类显然不是为了继承而设计的,所以是的,而是聚合它们。类似

的东西呢?
class Body {
public:
    Body( b2Body* b ) : b2b( b ) {}

private:
    b2Body*const b2b;
};

class World {
public:
    World() : b2w( /* create b2w here */ ) {}

    Body *CreateBody() {
            return new Body( b2w->CreateBody( /*...*/ ); }
    }
private:
    b2World*const b2w;
};

关于c++ - 不可能从这个对象继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1579618/

相关文章:

c++ - Box2D:旋转电机关节不工作

c++ - 如何循环遍历 map 的 C++ map ?

c++ - 异步运行的函数的返回类型应该是什么

Python 继承 - 一个调用在子类中重写的方法的构造函数,使用哪个方法?

c# - Repository模式的通用接口(interface)继承和类实现

ios - 使用委托(delegate)时弹出 ViewController

Box2d:为什么不是凹形?

c++ - 将 NumericMatrix 与 Rcpp 连接起来

c++ - 使用结构的隐式类型转换

C# XNA Box2d : What kind of joints for a ragdoll?