题
其实,我这里有一个设计问题。它非常简单但问题是:
我有了声明为私有成员一个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;
然后,周围的代码可以遍历向量的元素自如,通过只是一对迭代的。
不隶属于 StackOverflow