我试图创建一个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];
};
答案 0 :(得分: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等。这些允许我们打印他们的内容,而不涉及访问这些聚合的内部的任何朋友。怎么样?这些集合提供了 iterators ,这是一个非常重要的概念,在您的列表设计中似乎缺乏。
通过提供迭代器,您实际上可以使用列表实现几乎任何您能想象到的东西,而不必试图访问任何内部。