首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一个类中的向量,如何仅限制它一次?

一个类中的向量,如何仅限制它一次?
EN

Stack Overflow用户
提问于 2019-02-18 21:20:48
回答 2查看 68关注 0票数 0

我有一个:

代码语言:javascript
运行
复制
class galaxy
{
private:
    std::string type;
    double mass;
    std::vector<galaxy> satellites;
public: 
//things here
};

所以一个星系可以有卫星,这些卫星本身就是星系。但如果我这样做,卫星本身就会有卫星。

除了星系向量之外,我还必须用同样的属性创建另一个类吗?还是有其他更好的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-18 22:26:45

为什么卫星不能有卫星?我们整个宇宙是如何运作的,这几乎是绕体运行的一种递归模式!

但是,把这个放在一边。

如果,在你的概念中,不是每个星系都能有卫星,那么卫星列表就不应该是galaxy的一部分。

为什么不把这种逻辑从课堂上拿出来呢?

代码语言:javascript
运行
复制
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>>

但我将让您了解细节:重点是这个容器可能不应该在您的类中。

票数 0
EN

Stack Overflow用户

发布于 2019-02-18 21:46:07

您可以在您的情况下应用组合设计模式。我们定义了两个被隔开的卫星和星系。但只有银河有卫星的容器(载体)。

这是我的示例解决方案:

代码语言:javascript
运行
复制
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();
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54755538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档