this question之后,人们建议我使用“ option 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

但这有两个主要问题:


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


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

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



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


option 3c
option 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;
};

10-06 15:54