共享来自多个类的成员变量的访问权限

时间:2015-04-14 07:54:32

标签: c++ oop

考虑以下示例

class GameObject {
  vec3 position;
  SphereCollider collider;
  // ...
};

SphereCollider* GameObject::getCollider(){
  return &collider;
}


class SphereCollider {
  vec3 position;
  float radius;
};

您可以注意到,在此设计中,更多类之间共享成员变量positionradius表示可以有其他数据成员。

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();

将对象的引用存储为skip
SphereCollider* GameObject::getCollider(){
  collider->setPosition(position);
  return &collider;
}

1 个答案:

答案 0 :(得分:0)

说具体的选择可能取决于各种更一般的设计因素,我更喜欢你的选择(3)。通过定义GameObject的正确移动构造函数,可以轻松解决向量调整大小的问题:将在需要时调用它。

请参阅以下问题/答案:

Why does resize() cause a copy, rather than a move, of a vector's content when capacity is exceeded?

How to enforce move semantics when a vector grows?