2012-03-02 62 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

相關問題