[如果向量是类成员,如何允许访问向量元素?

问题描述 投票:0回答:2

我在封装矢量时遇到问题。这是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中的值,但这对我来说似乎并不干净。

是否有解决此问题的标准方法?封装矢量,只暴露某些部分,而不必重新实现所有标准矢量功能。

c++ oop vector stl
2个回答
0
投票

我个人将执行以下操作:

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时,这将准备好进行范式循环。


0
投票

使用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
© www.soinside.com 2019 - 2024. All rights reserved.