“如果您修改此类,它将无法与其他地方定义的类一起使用。
这些问题也有很多解决方案。
通常使用(智能)指针和/或引用而不是类本身来形成接口,以避免代码的两个部分必须就类的大小达成一致。
因此,例如,而不是:
class EntityCollection
{
private:
vector <Entity> entities;
public:
void addEntity(Entity e) { entities.push_back(e); }
void removeEntity(Entity e) { ... }
};
我们将使用指针样式存储(应该真正使用智能指针,但为了简短起见,我不是):
class EntityCollection
{
private:
vector <Entity*> entities;
public:
void addEntity(Entity* e) { entities.push_back(e); }
void removeEntity(Entity* e) { ... }
};
现在,无论实体有多大,或者它包含什么,它在向量中仍然是“指针大小的”。
另一个变体是有一个“pimpl”接口。你有一个主类定义,里面是一个(智能)指向实现类的指针,它提供了一组已知的虚函数。
像这样的东西:
class Entity
{
public:
class EntityImpl
{
virtual int func() = 0;
...
};
Entity(EntityImpl* impl) pImpl(impl) {}
...
int func() { return pImpl->func(); }
private:
EntityImpl* pImpl;
};
这些当然不是您唯一可能关心的问题,但应该给您一些“这是您用来解决问题的东西”的想法。