假设我有一个实例化的类车辆的数字实例。如果车辆对象由于某种原因想要查询其他现有车辆(例如找到最近的车辆),那么该类是否应该通过静态成员和方法来管理实例化对象,如下面的代码所示?这是一个很好的设计模式吗?这是一个共同的标准吗?如果采取这种方法,有什么陷阱吗?
#include <vector>
#include<algorithm>
struct Location {
double x, y, z;
Location(double xx, double yy, double zz) : x(xx), y(yy), z(zz) {}
};
class Vehicle {
private:
Location l;
public:
Vehicle (Location ll) : l(ll) {
vv.push_back(this);
}
static std::vector<Vehicle*> vv;
~Vehicle() {
std::vector<Vehicle*>::iterator it;
// removing the Vehicle object from the list of existing vehicles
for (it = vv.begin(); it != vv.end(); it++){
if (*it == this) {
vv.erase(std::remove(vv.begin(), vv.end(), this), vv.end());
}
}
}
Vehicle& find_nearest_vehicle () {
// code to iterate through list of existing vehicles and find the nearest vehicle
}
};
static std::vector<Vehicle*> vv;
答案 0 :(得分:4)
将其置于用作示例的任何典型OO场景中:
你所要求的是基于意见的,但我相信大多数人会说“不”。您可以使用某种管理器类来控制实例。
在你的情况下,我有一辆知道它位置的车辆和一辆知道所有车辆的VehicleManager。如果你想知道车辆是什么颜色,你问车辆。如果你想知道所有红色车辆的位置 - 你问车辆管理员。
您的解决方案有一个组合的车辆/车辆管理器,它依赖于静态的车辆集合,因此您只能拥有一套。如果你使用我所描述的两个类,你可以有多个集合。例如不同公司的车辆或卡车与汽车等 - 确定还有其他方法可以做到这一点,但您的解决方案会锁定您。使用2个类更加灵活。
所以回答你的最后评论:do you think it's ok or is it a terrible design?
- 这是一个糟糕的设计。