C++ 从子类访问私有结构

C++ 从子类访问私有结构,c++,class,C++,Class,我需要在这个类中实现这两个方法。Elem&运算符*()和Elem*运算符->()。唯一的问题是迭代器类是在映射类中定义的。而元素是在父类的私有部分定义的。问题是不允许我修改类的.h文件 class Iterator{ public: Iterator(){} explicit Iterator(Elem *cur):_cur(cur) {} Elem& operator*(); Elem* operator->

我需要在这个类中实现这两个方法。Elem&运算符*()和Elem*运算符->()。唯一的问题是迭代器类是在映射类中定义的。而元素是在父类的私有部分定义的。问题是不允许我修改类的.h文件

class Iterator{
    public:
        Iterator(){}
        explicit Iterator(Elem *cur):_cur(cur) {}
        Elem& operator*();
        Elem* operator->();
        // Iterator operator++(int);
        bool operator==(Iterator it);
        bool operator!=(Iterator it);
    private:
        Elem* _cur;
    };
这是我试图实现的函数。但是,它不起作用,因为它说结构是私有的

Map::Elem& Map::Iterator::operator*(Iterator it){
//do stuff
}
该类在另一个类中定义。该结构是在私有部分下定义的。如果Elem结构是私有的,我不确定如何从迭代器类中返回Elem&或Elem*。然而,我怀疑这与元素有关;在迭代器类的私有函数中定义

下面是Map类中定义的结构。如果这有道理的话。。它是私人的

private:
    struct Elem {
        KEY_TYPE key;
        VALUE_TYPE data;
        Elem *left;
        Elem *right;
    };
    Elem *_root;  // a dummy root sentinel 
    int _size;
如果我包含的内容不起作用,下面是完整的类定义。只是想包含上面的示例以减少代码

#ifndef MAP_H
#define MAP_H
#include <iostream>
#include <string>

using namespace std;

typedef string KEY_TYPE;
typedef string VALUE_TYPE;

class Map{
    struct Elem; //declaration of an interal structure needed below...

  public:
    //---Constructors and destructors---
    Map();               // constructs empty Map
    Map(const Map &rhs); // copy constructor 
    ~Map();              // destructor

    // assignment operator
    Map& operator=(const Map &rhs);

    // insert an element; return true if successful
    bool insert(KEY_TYPE, VALUE_TYPE);

    // remove an element; return true if successful
    bool erase(KEY_TYPE);

    // return size of the Map
    int size() const;

    // return an iterator pointing to the end if an element is not found,
    // otherwise, return an iterator to the element
    class Iterator;
    Iterator find(KEY_TYPE) const;

    // Iterators for accessing beginning and end of collection
    Iterator begin() const;
    Iterator end() const;

    // overloaded subscript operator
    VALUE_TYPE& operator[](KEY_TYPE);

    // output the undering BST
    ostream& dump(ostream& out) const;

    // a simple Iterator, won't traverse the collection
    class Iterator{
    public:
        Iterator(){}
        explicit Iterator(Elem *cur):_cur(cur) {}
        Elem& operator*();
        Elem* operator->();
        // Iterator operator++(int);
        bool operator==(Iterator it);
        bool operator!=(Iterator it);
    private:
        Elem* _cur;
    };

private:
    struct Elem {
        KEY_TYPE key;
        VALUE_TYPE data;
        Elem *left;
        Elem *right;
    };
    Elem *_root;  // a dummy root sentinel 
    int _size;

    // helper method for inserting record into tree.
    bool insert(Elem *& root, const KEY_TYPE& key, const VALUE_TYPE& data);

    // helper method for print tree
    void printTree(ostream& out, int level, Elem *p) const;

    // common code for deallocation
    void destructCode(Elem *& p);

    // common code for copy tree
    void copyCode(Elem* &newRoot, Elem* origRoot); 
};

ostream& operator<< (ostream&, const Map&);

#endif
\ifndef映射
#定义映射
#包括
#包括
使用名称空间std;
typedef字符串键类型;
类型定义字符串值\u类型;
类图{
struct Elem;//下面需要的内部结构声明。。。
公众:
//---构造函数和析构函数---
Map();//构造空映射
Map(const Map&rhs);//复制构造函数
~Map();//析构函数
//赋值运算符
映射和运算符=(常量映射和rhs);
//插入元素;如果成功,则返回true
布尔插入(键类型、值类型);
//删除元素;如果成功,则返回true
布尔擦除(按键类型);
//返回地图的大小
int size()常量;
//如果未找到元素,则返回指向末尾的迭代器,
//否则,向元素返回迭代器
类迭代器;
迭代器查找(键类型)常量;
//用于访问集合开始和结束的迭代器
迭代器begin()常量;
迭代器end()常量;
//重载下标运算符
值类型和运算符[](键类型);
//输出欠平衡BST
ostream&dump(ostream&out)const;
//一个简单的迭代器,不会遍历集合
类迭代器{
公众:
迭代器(){}
显式迭代器(Elem*cur):\u cur(cur){
电子及操作员*();
元素*运算符->();
//迭代器运算符++(int);
布尔运算符==(迭代器it);
布尔运算符!=(迭代器);
私人:
元素*_cur;
};
私人:
结构元素{
按键式按键;
值类型数据;
元素*左;
元素*对;
};
Elem*_root;//伪根哨兵
内部尺寸;
//用于将记录插入到树中的助手方法。
布尔插入(元素*&根、常量键类型和键、常量值类型和数据);
//打印树的辅助方法
无效打印树(ostream&out,整数级,元素*p)常数;
//解除分配的通用代码
无效自毁码(Elem*&p);
//复制树的通用代码
无效复制码(Elem*&newRoot,Elem*origRoot);
};

ostream&operator问题不在于
Elm
是私有的。改变

Map::Elem& Map::Iterator::operator*(Iterator it){
//do stuff
}


因为前者与标头中声明的签名不匹配。这会导致定义的运算符重载不在类的范围内

问题不在于
Elm
是私有的。改变

Map::Elem& Map::Iterator::operator*(Iterator it){
//do stuff
}


因为前者与标头中声明的签名不匹配。这会导致定义的运算符重载不在类的范围内

如果它应该可以被子类访问,它将被标记为
受保护
。@tadman是否可以用它当前的设置方式实现它?如果它应该可以被子类访问,它将被标记为
受保护
。@tadman是否可以用它当前的设置方式实现它目前已经准备好了?哇…我这方面很笨。。不知道我怎么没看到。谢谢哇…我这方面很笨。。不知道我怎么没看到。非常感谢。