不可能继承这个对象?

时间:2009-10-16 18:27:34

标签: 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是私有的)
  2. 即使可以,但b2Body部分也无法正确初始化(b2World::CreateBody 需要被调用)
  3. 这是否意味着我永远不能从b2Body / b2World继承并遵循相同的设计模式? (请记住,我无法编辑b2 *类)

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


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

1 个答案:

答案 0 :(得分:2)

只有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;
};