其实,我这里有一个设计问题。它非常简单但问题是:

我有了声明为私有成员一个STL向量中的一个C ++类。但该类的客户需要这个矢量迭代。

在C#中,我们有一个非常方便的声明,产量,在这样的情况下,你写一个函数返回一个IEnumerable,它“产量”你一个很好的方式来遍历这个类内部的专用容器。

我只是想的,而不是使用像的GetValue方法来寻找用于C ++优雅溶液,(INT IDX)。

任何建议?

示例:

class Fat
{
   public:
      Fat();
   // some code here ...

   private:
      void LoadSectors(SECT startPoint);
      std::vector<SECT>sectors;

};

class Storage
{
   public:
      Storage(string CompoundFile);

      //For example, this method will receive a ref to my fat system and iterate over
      //the fat array in order to read every sector. 
      LoadStrem(Fat& fat);

};

这是远简单的例子。

有帮助吗?

解决方案

有在C没有语法糖++类似于在C#yield。如果你想创建一个类,它的实例应该以同样的方式股票STL集合是可迭代的,那么你必须为实现您的类的迭代器,公开为::iterator你的类型,并提供begin()end()成员函数。

其他提示

您可以创建它返回一个参考(或优选const引用)到所述载体的访问器功能,或者可以创建begin()end()存取器函数,其返回适当的向量迭代器。

它总是在你需要发布你的类的内脏伤害...

您可能能够通过提供算法作为STL并解决它:提供对象的接口上的foreach功能

class S { 
   std::vector<int> v;

public:
   //... and some methods to populate the vector

   template< typename F > F& foreach( F& f ) { 
      return std::for_each( v.begin(), v.end(), f );
   }

};

这样,类仍然是“封闭”,但你有你需要的灵活性。您还可以添加一个copy功能,也许transform;这些是我最经常需要的人。

让你的类暴露的迭代器。

class Fat
{
   public:
    typedef std::vector<SECT>::iterator iterator;

    iterator begin() { return sectors.begin(); }
    iterator end() { return sectors.end(); }

      Fat();
   // some code here ...

   private:
      void LoadSectors(SECT startPoint);
      std::vector<SECT>sectors;

然后,周围的代码可以遍历向量的元素自如,通过只是一对迭代的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top