Наличие ошибок при попытке использовать друга - PullRequest
1 голос
/ 03 марта 2012

Я пытаюсь создать 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 Ответ

1 голос
/ 03 марта 2012

Прежде всего, 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 и т. Д. Они позволяют нам печатать их содержимое без каких-либо друзей, которые имеют доступ к внутренним компонентам этих агрегатов. Как? Эти коллекции предоставляют итераторов , очень важную концепцию, которой, по-видимому, не хватает в дизайне вашего списка.

Предоставляя итераторы, вы можете реализовать практически все, что вы можете себе представить, используя список, даже не испытывая соблазнов получить доступ к каким-либо внутренним элементам.

...