我在封装矢量时遇到问题。这是C ++ 11之前的代码。
我有一个类,我们称它为A,它具有一个对象向量作为成员变量。我不想将向量直接提供给A类的客户端。但是,作为第一步,我公开了向量。
class A
{
public:
struct ConnectionEntry
{
int portNumber;
...
}
std::vector<ConnectionEntry> m_connectionList;
private:
}
我的代码的某些部分必须创建A类的向量并遍历所有向量。当我需要访问m_connectionList
的所有元素时,我会得到难看的代码。
vector<A> vecOfA;
for (vector<A>::iterator it = vecOfA.begin; it != vecOfA.end(); it++)
{
for (vector<A::ConnectionEntry>::iterator conn = it->m_connectionList.begin();
conn != it->m_connectionList.end();
conn++)
{
}
}
我不喜欢暴露载体。我正在考虑为类A实现operator[]
和size()
并转发m_connectionList中的值,但这对我来说似乎并不干净。
是否有解决此问题的标准方法?封装矢量,只暴露某些部分,而不必重新实现所有标准矢量功能。
我个人将执行以下操作:
class A
{
public:
struct ConnectionEntry
{
int portNumber;
...
}
typedef iterator typename std::vector<ConnectionEntry>::iterator;
typedef const_iterator typename std::vector<ConnectionEntry>::const_iterator;
// hope I got that one right, I am used to using
iterator begin() { return m_connectionList.begin(); }
iterator end() { return m_connectionList.end(); }
iterator cbegin() const { return m_connectionList.cbegin(); }
iterator cend() const { return m_connectionList.cend(); }
private:
std::vector<ConnectionEntry> m_connectionList;
}
并像这样使用它:
vector<A> vecOfA;
for (vector<A>::iterator it = vecOfA.begin; it != vecOfA.end(); it++)
{
for (A::iterator conn = it->begin(); conn != it->end(); conn++)
{
}
}
顺便说一句,将来您可以切换到C ++ 11时,这将准备好进行范式循环。
使用C ++ 03时,这些可能性:
#include <iostream>
#include <vector>
struct Foo {
struct Bar {
int value;
};
std::vector<Bar> bars;
};
int main() {
std::vector<Foo> foos;
for (unsigned int i = 0; i < foos.size(); ++i) {
for (unsigned int j = 0; j < foos[i].bars.size(); ++j) {
// do something
}
}
// or
typedef std::vector<Foo>::iterator FooIt;
typedef std::vector<Foo::Bar>::iterator BarIt;
for (FooIt foo = foos.begin(); foo != foos.end(); ++foo) {
for (BarIt bar = foo->bars.begin(); bar != foo->bars.end(); ++bar) {
// do something
}
}
return 0;
}
如果您切换到C ++ 11,则可以使用range-for
循环:
range-for