2012-03-02 77 views
1

我试图创建一个MultiListADT,并且无法编写将打印出列表的代码。我试图在一个类中创建一个函数作为另一个类的一个朋友,这样我就可以创建一个方法让我打印列表。但即时通讯无法让朋友功能正常工作。我只会包含部分代码,所以它不会太长。我得到的错误是错误C2039'PrintList'不是'MultiListADT的成员。林新使用的朋友,所以我不太清楚我可以如何使这项工作。尝试使用朋友时发生错误

MultiListADT.h

#include <iostream> 
#include <fstream> 
#include "NodeADT.h" 
#include <string> 

using namespace std; 



template <class TYPE,int threads> 
class MultiListADT 
{ 
public: 
/** Constructor **/ 
MultiListADT(); 

/** Destructor **/ 
~MultiListADT(); 

/** Declare accessors (observers) **/ 
void ResetListForward(int=0); 
void ResetListBackward(int=0); 
bool IsEmpty(int=0); 
int LengthIs(int=0); 
bool Search(TYPE, bool=true,int=0); 
void GetNextItem(TYPE &,int i=0); 
void GetPreviousItem(TYPE &,int=0); 
int GetInfo(int=0); 
int findCountry(TYPE,int=0); 
int findContinent(TYPE,int=0); 
int findYear(TYPE,int=0); 
friend void PrintList(MultiListADT<string,100>&,int=0); 

/** Declare mutators (transformers) **/ 
void MakeEmpty(); 
void AddToFront(TYPE,int=0); 
void AddToRear(TYPE,int=0); 
void InsertInOrder(TYPE,int=0); 
void Delete(TYPE); 
void Sort(); 



private: 
NodeADT<TYPE,threads>* head[threads]; 
NodeADT<TYPE,threads>* tail[threads]; 
int length; 
string indices[threads]; 
NodeADT<TYPE,threads>* currentNode[threads]; 
}; 

template <class TYPE, int threads> 
void MultiListADT<string,100>::PrintList(MultiListADT<string,100> &theList,int i) 
{ 
    //code for reading out list 
} 

NodeADT.h

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

const int null = 0; 

template<class TYPE, int threads> 
class MultiListADT; 

template <class TYPE, int threads> 
class NodeADT 
{ 
public: 
NodeADT(); 
NodeADT(TYPE); 
~NodeADT(); 
TYPE getInfo(); 
NodeADT<TYPE, threads>* getPrevious(int=0); 
NodeADT<TYPE, threads>* getNext(int=0); 
void setNext(NodeADT<TYPE, threads>*,int=0); 
void setPrevious(NodeADT<TYPE, threads>*,int=0); 
bool Search(TYPE, bool=true,int=0); 
void AddToFront(TYPE item, int=0); 
void AddToRear(TYPE item,int=0); 
void InsertInOrder(TYPE, int=0); 
bool Delete(TYPE,int=0); 
int findCountry(TYPE,int=0); 
int findContinent(TYPE,int=0); 
int findYear(TYPE,int=0); 
bool Comparelist(TYPE,TYPE,int=0); 
friend void PrintList(MultiListADT<TYPE,threads>&,int=0); 
private: 
TYPE info; 
NodeADT<TYPE, threads>* prev[threads]; 
NodeADT<TYPE, threads>* next[threads]; 
}; 

回答

1

首先被的printList旨在是一个成员或非成员?你有这样的:

friend void PrintList(MultiListADT<string,100>&,int=0); 

...但你要定义它像一个方法:

template <class TYPE, int threads> 
void MultiListADT<string,100>::PrintList(MultiListADT<string,100> &theList,int i) 
{ 
    //code for reading out list 
} 

请注意,这应该阅读:

template <class TYPE, int threads> 
void MultiListADT<TYPE,threads>::PrintList(MultiListADT<TYPE,threads> &theList,int i) 
{ 
    //code for reading out list 
} 

如果它是一个方法在MultiListADT中,那么你不需要在那里声明它是一个朋友。只要将其定义为常规方法即可。如果您想从NodeADT访问该方法,那么如果该方法是私有的,则可以将MultiListADT类设置为朋友。然而,在我看来,你正试图让它公开,在这种情况下,你根本不需要朋友。

最后,作为建议,我建议您尝试尽可能避免朋友。仔细想想这个设计,看看标准容器,比如std :: vector,std :: list等。这些允许我们打印他们的内容,而不需要任何参与这些聚合内部的朋友。怎么样?这些集合提供了迭代器,这是一个非常重要的概念,在您的列表设计中似乎很缺乏。

通过提供迭代器,您实际上可以实现几乎任何您可以想象的使用列表,而无需试图访问任何内部。

+0

好的,生病了试试看,使用朋友的原因是我的教授告诉我们在某些情况下使用它,我真的不会想到如何以其他方式使用它。 – Soul3lade 2012-03-02 23:05:47

+0

好吧,我试了一下,现在它认识到了这个方法,但我不认为它获得了朋友特权,因为我得到了一堆'next'和'info'无法访问的错误。 – Soul3lade 2012-03-02 23:09:37

+0

好吧我只是使用MultiListADT内部的方法来让它工作,所以现在所有的工作谢谢。 – Soul3lade 2012-03-02 23:14:37

相关问题