首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么在嵌套类的外围类访问嵌套类的私有成员

2013-12-22 
如何在嵌套类的外围类访问嵌套类的私有成员?本帖最后由 zyjisdog 于 2013-12-21 13:53:54 编辑这里有个Lis

如何在嵌套类的外围类访问嵌套类的私有成员?
本帖最后由 zyjisdog 于 2013-12-21 13:53:54 编辑 这里有个List类嵌套了一个友元类Iterator:



class List
{
private:
        struct Node
        {  
             ....
        };   
  ......
public:
        friend class Iterator;
        class Iterator
        {
        private:
        List plist;
        typename List::Node *p;

        ......
        };
};


怎么在List类里访问Iterator的plist和p呢?

我是在Iterator的public里添加两个方法get_plist()和get_p(),然后在List里用
Iterator& begin() { Iterator::get_p() = Iterator::get_plist()->List::head; return Iterator; }这种方法来获得plist和p。
但是会出错:error C2352: “List::Iterator::get_p”: 非静态成员函数的非法调用

求教各位大大,谢谢~
[解决办法]
大概这么处理,就可以了,其实 Node*,就是Iterrator
class List
{
public:
   //typedef int elemtype; 
private:
        struct Node
        {  elemtype elem;
             ....
        };   
  ......

public:
       friend class Iterator;
       class Iterator
       {
        private:           
            typename List::Node *p;
            Iteratror(const Node *node = NULL)p(node){} 
            public:
            //不带空头结点
            elemtype& operator*(){return p->elem;}
            const elemtype& operator*()const{return p->elem;}
            Iteratror&  operator=(const Iteratror&){....return *this;}
            ......
        };
        Node *head;
        Iteratror begin(){return Iteratror (head);} 
        Iteratror end(){return Iteratror ();}      
          
};
[解决办法]
引用:
Quote: 引用:

这里有个List类嵌套了一个友元类Iterator:



class List
{
private:
        struct Node
        {  
             ....
        };   
  ......
public:
        friend class Iterator;
        class Iterator
        {
        private:
        List* plist;
        typename List::Node *p;

        ......
        };
};

正确应该这样的

typename应改为 typedef 吧
改成这样是对的,你自己比着葫芦画个瞟吧

class Listt


{
private:
struct Node
{

};

public:

void lgete(){
int c=Iterator::get();
}
class Iterator{
friend void Listt::lgete();
private:
Listt* plist;
typedef Listt::Node *p;
private:
int a;
static int get(){return 1;}
};

};

热点排行