2012-04-26 58 views
2

如果我想要一个具有指向其他可能允许周期循环的类的指针向量的类,它有多危险?例如,假设我有一个文本文件,它看起来像这样:指向相同类型指针的向量类型设计可行性

city=Detroit 
{ 
    sister=Toyota 
    sister=Dubai 
    ... 
} 
... 

首先,文件读入一系列临时类,ParsedCity,所在城市的名称和姓名的姊妹城市举行。在我拥有文件中的所有城市后,我创建了实际的城市课程。

class City 
{ 
    private: 
     std::string name; 
     std::vector<City*> sisterCities; 
    public: 
     City(const std::string& aName); 
     CreateRelations(const ParsedCity& pcs); 
     std::string Name() const { return name; } 
}; 

//If this were to represent Detroit, pc would contain a vector of strings 
//containing Toyota and Dubai. Cities contain the actual classes that sister 
//cities should point to. It holds all cities of the world. 
City::CreateRelations(const ParsedCity& pc, std::vector<City>& cities) 
{ 
    for (unsigned int i = 0; i < pc.ParsedSisterCities().size(); i++) 
    { 
     for (unsigned int j = 0; j < cities.size(); j++) 
     { 
      if (pc.ParsedSisterCities()[i] == cities[j].Name()) 
      { 
       sisterCities.push_back(&cities[j]); 
       break; 
      } 
     } 
    } 
} 

我担心的是,如果越来越多的城市都推到主城向量,该向量将重新大小,搬迁到别的地方,我的所有城市将指向被悬摆指针sisterCities。至少这是我的想法,会根据我对矢量类的了解而发生。如果世界上所有的城市和姊妹城市都存储在一个链表中,这能解决我的问题吗?我想要一个保证,一旦城市建成它不会移动(在记忆中,坏的双关?)

这对我来说似乎是一个棘手的问题。就好像我打电话给姊妹城市底特律一样,我可以称之为姊妹城市等,然后我可以最终回到底特律!如果Topeka将其名称更改为Google,托皮卡的所有姐妹城市都应该自动知道(因为它们都指向Topeka所在的内存中的同一个位置)。

任何意见是赞赏!

回答

2

如果你有一个指针矢量,并且矢量调整大小,内存中的pointees位置不受影响,所以你的指针保持有效。

该解决方案的最大问题是任何递归算法适用于您的数据结构都必须有一些机制来检测周期,否则由于无限递归导致堆栈溢出。

编辑:

我才意识到,我最初误解你的问题。如果cities -vector调整大小,则指向其元素的任何指针都将失效。最好的选择是商店指向该矢量城市。为了使这个更易于管理,我建议你使用boost::ptr_vector。这有一个好处,即使你从你的矢量中删除一个城市,或者你重新排列矢量中的城市(例如,如果你想按照名称对它们进行排序以便快速查找),指向城市的指针仍然有效。

+0

这很棒,但只是为了澄清,你是否说,即使矢量调整大小,“&cities [0]”将始终指向相同的内存位置? – 2012-04-26 15:58:04

+0

对不起,我误解了你的问题。我编辑了我的答案来解决这个问题。 – 2012-04-26 18:30:59

0

这对我来说似乎是个棘手的问题。就好像我打电话给姊妹城市 底特律,我可以称之为姊妹城市等,然后我可以在底特律回来 !

这是一个“循环参考”。这在C++中不一定是问题,因为手动对象是deleted。但是,正如你所认识的那样,它可能会在你的设计中引入复杂的问题。

相关问题