所以我正在使用模板,我遇到了一个问题。将代码转换为模板后,我无法再访问类的私有成员。我得到'current'是'Iterator'的私有成员的错误。所以首先我要上课:
template <class T>
struct nodeType {
T info;
nodeType<T> *link;
};
template <class T>
class Iterator {
public:
Iterator();
Iterator(nodeType<T> *);
T operator*();
bool IsNull();
Iterator<T> operator++();
Iterator<T> operator++(int);
bool operator==(const Iterator<T> &) const;
bool operator!=(const Iterator<T> &) const;
Iterator<T> &operator=(T);
private:
nodeType<T> *current;
};
template <class T>
class LinkedList {
public:
LinkedList();
LinkedList(const LinkedList<T> &);
~LinkedList();
void InsertHead(T);
Iterator<T> InsertAfter(T, Iterator<T>);
Iterator<T> Search(T);
bool IsEmpty();
void Print();
void DestroyList();
Iterator<T> Start();
Iterator<T> End();
const LinkedList<T> &operator=(const LinkedList<T> &);
private:
nodeType<T> *head;
};
在我使用模板之前,我使用了以下代码,但current
不是私有的,这不再有效。
template <class T>
Iterator<T> LinkedList<T>::InsertAfter(T input, Iterator<T> marker) {
Iterator<T> newNode = new nodeType<T>;
Iterator<T> findNode = marker;
newNode = input;
newNode.current->link = findNode.current->link;
findNode.current->link = newNode.current;
return findNode;
}
然后我尝试执行以下操作并且没有错误但是当我调用InsertAfter
函数将新项添加到列表时它没有显示。我做了cout
newNode =输入;它显示了我想要插入的值,但节点似乎没有连接起来。为什么我不能使用以前的代码?与newNode.current->link = findNode.current->link;
template <class T>
Iterator<T> Iterator<T>::operator++() {
current = current->link;
return *this;
}
template <class T>
Iterator<T> Iterator<T>::operator++(int) {
Iterator<T> temp;
temp = *this;
++(*this);
return temp;
}
template <class T>
Iterator<T> LinkedList<T>::InsertAfter(T input, Iterator<T> marker) {
Iterator<T> newNode = new nodeType<T>;
Iterator<T> findNode = marker;
newNode = input;
newNode++ = findNode++;
findNode++ = newNode;
return findNode;
}
答案 0 :(得分:0)
您无法在newNode.current
的成员函数中执行LinkedList
,因为current
属于Iterator
。这就是private
的意思 - 它只能从它所属的类的成员函数中访问。
显然,您的“旧”代码不同。可能你在旧代码中有Iterator friend
LinkedList。如果你发布旧代码,它可能会清除。