考虑以下示例
class GameObject {
vec3 position;
SphereCollider collider;
// ...
};
SphereCollider* GameObject::getCollider(){
return &collider;
}
class SphereCollider {
vec3 position;
float radius;
};
您可以注意到,在此设计中,更多类之间共享成员变量position
。 radius
表示可以有其他数据成员。
SphereCollider后来用于碰撞检测,我有更多类GameObject(没有共同的祖先)组成SphereCollider。
明智地处理这种情况设计和性能的最简洁方法是什么?这是否有约定?
我脑子里的解决方案很少,但没有一个是完美的。你能想到一个更好的解决方案吗?
1)通过getter / setter持久访问数据成员
缺点:无法直接访问类中的数据成员。是否有一个惯例向程序员说明这个事实,他将进一步研究这门课程?
void GameObject::setPosition(vec3& pos){
position = pos;
colliser->setPosition(pos);
}
vec3 GameObject::getPosition(){
return position;
}
2)删除冗余并使用对SphereCollider的getter / setter访问
缺点:类似于1)
class GameObject {
SphereCollider collider;
};
void GameObject::setPosition(vec3& pos){
colliser->setPosition(pos);
}
3)从SphereCollider到GameObject数据成员的引用/指针
缺点:重新分配(例如std :: vector)GameObject可能会导致麻烦。有没有办法告诉用户这个类?
class GameObject {
vec3 position;
SphereCollider collider;
public:
GameObject(){
collider = SphereCollider(position);
}
};
class SphereCollider {
const vec3& position;
float radius;
public:
Collider(vec3& pos)
: position(pos)
{
}
};
4)按需将数据传播到SphereCollider
缺点:用户可以使用getCollider();
将对象的引用存储为skipSphereCollider* GameObject::getCollider(){
collider->setPosition(position);
return &collider;
}
答案 0 :(得分:0)
说具体的选择可能取决于各种更一般的设计因素,我更喜欢你的选择(3)。通过定义GameObject
的正确移动构造函数,可以轻松解决向量调整大小的问题:将在需要时调用它。
请参阅以下问题/答案:
Why does resize() cause a copy, rather than a move, of a vector's content when capacity is exceeded?