从子类

时间:2016-10-25 17:32:04

标签: c++ class

我需要在这个类中实现这两个方法。 ELEM&安培; operator *()和Elem * operator->()。唯一的问题是Iterator类是在Map类中定义的。而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结构是私有的,则来自Iterator类中的Elem *。但是我怀疑它与Elem * _cur有关;在Iterator类的私有函数中定义。

这是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

任何帮助都会很棒。谷歌一直没有这样的运气。

1 个答案:

答案 0 :(得分:2)

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

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

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

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