在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 *类)如果是这样,我想你们会建议我只保留
b2World
和b2Body
作为成员变量?我认为现在归结为以下两个选项:
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;
};