一个类应该管理它的实例化对象吗?

时间:2017-11-29 22:22:06

标签: c++ class object

假设我有一个实例化的类车辆的数字实例。如果车辆对象由于某种原因想要查询其他现有车辆(例如找到最近的车辆),那么该类是否应该通过静态成员和方法来管理实例化对象,如下面的代码所示?这是一个很好的设计模式吗?这是一个共同的标准吗?如果采取这种方法,有什么陷阱吗?

  #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;

1 个答案:

答案 0 :(得分:4)

将其置于用作示例的任何典型OO场景中:

  • 动物是否了解其他所有动物?
  • 汽车是否了解其他所有汽车?
  • 颜色是否了解其他每种颜色?

你所要求的是基于意见的,但我相信大多数人会说“不”。您可以使用某种管理器类来控制实例。

在你的情况下,我有一辆知道它位置的车辆和一辆知道所有车辆的VehicleManager。如果你想知道车辆是什么颜色,你问车辆。如果你想知道所有红色车辆的位置 - 你问车辆管理员。

您的解决方案有一个组合的车辆/车辆管理器,它依赖于静态的车辆集合,因此您只能拥有一套。如果你使用我所描述的两个类,你可以有多个集合。例如不同公司的车辆或卡车与汽车等 - 确定还有其他方法可以做到这一点,但您的解决方案会锁定您。使用2个类更加灵活。

所以回答你的最后评论:do you think it's ok or is it a terrible design? - 这是一个糟糕的设计。