类中的类向量,如何仅限制1次?

时间:2019-02-18 21:20:48

标签: c++ class

我有一个:

class galaxy
{
private:
    std::string type;
    double mass;
    std::vector<galaxy> satellites;
public: 
//things here
};

因此,星系可以拥有本身就是星系的卫星。但是,如果我这样做,那么卫星本身就会拥有卫星。

除了星系矢量之外,我是否必须创建具有完全相同属性的另一个类?还是还有另一种更好的方法?

2 个答案:

答案 0 :(得分:0)

您可以根据情况应用“复合设计模式”。我们定义了两个独立的星体Satellite和Galaxy。但是只有银河有卫星的容器(向量)。

这是我的示例解决方案:

class Component
{
protected:
  std::string type;
  double mass;
public:
    virtual void traverse() = 0;
};

class Satellite: public Component
{
  public:
    void traverse() override 
    {

    }
};

class Galaxy: public Component
{
private:
    vector < Component* > satellites;
public:
    void add(Component* item)
    {
        satellites.push_back(item);
    }
    void traverse() override 
    {
        for (int i = 0; i < children.size(); i++)
          satellites[i]->traverse();
    }
};

答案 1 :(得分:0)

为什么卫星不能有卫星?整个宇宙的运行方式几乎都是递归的!

但是,把它放在一边。

如果按照您的概念,并不是每个星系都可以拥有卫星,那么卫星列表就不应该成为galaxy的一部分。

为什么不把这种逻辑带出课堂呢?

class galaxy
{
private:
    std::string type;
    double mass;
public: 
//things here
};

std::map<galaxy, std::vector<galaxy>> galaxiesWithSatellites;

此地图将替换您当前用于存储星系的任何结构。现在整个应用程序中只有一个星系->卫星映射。

请注意,我并不一定建议它为map。随之而来的是它自身的复杂性(例如,您的星系需要小于可比性);您可以给每个星系分配自己的唯一ID,然后使用std::map<GalaxyId, std::vector<galaxy>>

但是我让您找出细节:关键是这个容器可能不应该在您的课程中。