2010-04-17 105 views
2

我始終認爲,內部類可以訪問所有的數據在其外部類,但有代碼:內部類和獲得外部成員

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_; 
} 
}; 

見行標記爲註釋。
因此,我可以在內部課堂上不能使用外部課程的成員嗎?
不要擔心命名,它不是一個矢量它是一個集合。
謝謝。

+0

如果你來自Java,C++在這方面是不同的。 嵌套類與封閉類是分開的。 – Anycorn 2010-04-17 18:19:39

回答

6

您需要將外部類的實例傳遞給內部類。換句話說,您的Iterator類必須有一個方便的實例Vector的引用(或指針)。最好的方法是讓Iterator構造函數參考Vector

Iterator(Vector& v) : vec_(v) 
{ 
    vec_.do_something(); 
} 
-1

您無法從C++中的sourrounding類訪問字段或方法!

相關問題