Внутренний класс и доступ к внешним членам - PullRequest
2 голосов
/ 17 апреля 2010

Я всегда думал, что внутренний класс имеет доступ ко всем данным в своем внешнем классе, но имеет код:

template<class T>
class Vector
{
 template<class T>
 friend
std::ostream& operator<<(std::ostream& out, const Vector<T>& obj);
private:
 T** myData_;
 std::size_t myIndex_;
 std::size_t mySize_;
public: 
 Vector():myData_(nullptr),
  myIndex_(0),
  mySize_(0)
 { }
 Vector(const Vector<T>& pattern);
 void insert(const T&);
 Vector<T> makeUnion(const Vector<T>&)const;
 Vector<T> makeIntersection(const Vector<T>&)const;
 class Iterator : public std::iterator<std::bidirectional_iterator_tag,T>
 {
 private:
  T** itData_;
 public:
  Iterator()//<<<<<<<<<<<<<------------COMMENT
  { /*HERE I'M TRYING TO USE ANY MEMBER FROM Vector<T> AND I'M GETTING ERR SAYING:
   ILLEGAL CALL OF NON-STATIC MEMBER FUNCTION*/}

  Iterator(T** ty)
  { 
   itData_ = ty;
  }

  Iterator operator++()
  {
   return ++itData_;
  }

  T operator*()
  {
   return *itData_[0];
  }

  bool operator==(const Iterator& obj)
  {
   return *itData_ == *obj.itData_;
  }

  bool operator!=(const Iterator& obj)
  {
   return *itData_ != *obj.itData_;
  }

  bool operator<(const Iterator& obj)
  {
   return *itData_ < *obj.itData_;
  }
 };

 typedef Iterator iterator;

 iterator begin()const
 {
  assert(mySize_ > 0);
  return myData_;
 }

 iterator end()const
 {
  return myData_ + myIndex_;
 }
};

См. Строку, помеченную как COMMENT.
Поэтому я могу или не могу использовать членыиз внешнего класса, а во внутреннем классе?
Не беспокойтесь о наименовании, это не Вектор, а Набор.
Спасибо.

Ответы [ 2 ]

6 голосов
/ 17 апреля 2010

Вам необходимо передать экземпляр внешнего класса во внутренний класс. Другими словами, ваш класс Iterator должен иметь ссылку (или указатель) на экземпляр Vector. Лучший способ сделать это - использовать для конструктора Iterator ссылку на Vector.

Iterator(Vector& v) : vec_(v)
{
  vec_.do_something();
}
0 голосов
/ 17 апреля 2010

Вы не можете получить доступ к полям или методам из окружающего класса в C ++!

...