Tablica asocjacyjna

Odpowiedz Nowy wątek
2015-01-23 22:11
0

Witam wszystkich!
To jest mój pierwszy post, więc od razu proszę o wyrozumiałość. ;)
Mam na zaliczenie do zaimplementowania tablicę asocjacyjną oraz jej wzorzec przy pomocy szablonów. bez szablonów kod jest dobry, kompiluje się i działa, jak powinien. Jednak po dodaniu template pojawiło się dużo błędów. Większość już udało mi się usunąć, ale nadal zostało mi kilka i nie mam pojęcia, czemu one się pojawiają i jak im zaradzić. Wstawiam mój kod oraz pojawiające się błędy. Z góry dziękuję za pomoc. Będę bardzo wdzięczny za wyjaśnienie, jak sobie radzić z takimi sytuacjami.

#include<iostream>
#include<cstring>
#include<cctype>

using namespace std;

template <class klasa1, class klasa2>
class Node{
    public:
        klasa1 key;
        Node<klasa1, klasa2> *next;
        klasa2 val;
        Node(klasa1 key = "", klasa2 val = 0) :key(key), next(0), val(val){};
    public:
        friend class AssocTab; 
};

template <class klasa1, class klasa2>
class AssocTab{
    public:
        Node<klasa1, klasa2> *head;
        Node<klasa1, klasa2> *tail;
        virtual bool exist(klasa1 key){
              if (!head) return 0;
              Node <klasa1, klasa2>*next=head;
              do{
                 if (next->key == key) return 1;
                 next = next->next;
              } while (next);
              return 0;  
        };
        virtual int& find(klasa1 key){
                    Node <klasa1, klasa2>*next = head;
                     do{
                      if (next->key == key) return next->val;
                       next = next->next;
                      } while (next);
                      return head->val;
                };
        int& create(klasa1 key, klasa2 val = 0);
        void clear();
        void coppy(const AssocTab &rref);
    public:
        AssocTab();
        AssocTab(AssocTab &arg);
        ~AssocTab();
        AssocTab<klasa1, klasa2>& operator=(const AssocTab &arg);
        int& operator[](klasa1 key);
        void pokaz(){
    if (head == 0)return;
       Node<klasa1, klasa2> *ptr = head;
    while (ptr){
        cout << (ptr->key) << " = " << (ptr->val) << endl;
        ptr = ptr->next;
    }
    cout << endl;
};
};

template <class klasa1, class klasa2>
class AssocTabN :public AssocTab<klasa1, klasa2>{
    public:
        Node<klasa1, klasa2> *head;  

       int& operator[](klasa1 key);
       virtual int& find(klasa1 key){
                    Node<klasa1, klasa2> *next = head;
                     do{
                      if (stricmp(next->key.c_str(),key.c_str())==0) return next->val;
                       next = next->next;
                      } while (next);
                      return head->val;
                }
       virtual bool exist(klasa1 key){
                if (!head) return 0;
                    Node<klasa1, klasa2> *next=head;
                    do{
                        if (stricmp(next->key.c_str(),key.c_str())==0) return 1;
                        next = next->next;
                    } while (next);
                    return 0;
                    }
};

template <class klasa1, class klasa2>
int& AssocTab<klasa1,klasa2>::create(klasa1 key, klasa2 val ){
    if (!head){
        tail=head = new Node<klasa1, klasa2>(key,val);
        return head->val;
    }
    else{
        tail->next = new Node<klasa1, klasa2>(key,val);
        tail = tail->next;
        return tail->val;
    }
}

template <class klasa1, class klasa2>
void AssocTab<klasa1, klasa2> ::clear(){
    if (head == 0)return;
        Node<klasa1, klasa2> *ptr = head, *nptr;
        while (ptr){
        nptr = ptr->next;
        delete ptr;
        ptr = nptr;
    }
    head = tail = 0;
}

template <class klasa1, class klasa2>
void AssocTab<klasa1, klasa2>::coppy(const AssocTab &rref){
    if (rref.head == 0)return;
        create(rref.head->key, rref.head->val);
        Node<klasa1, klasa2> *argptr = rref.head->next;
    while (argptr){
        create(argptr->key, argptr->val);
        argptr = argptr->next;
    }
}

template <class klasa1, class klasa2>
AssocTab<klasa1, klasa2>::AssocTab(){
    head = tail=0;
}

template <class klasa1, class klasa2>
AssocTab<klasa1, klasa2>::AssocTab(AssocTab &arg){
    head = 0;
    if (arg.head == 0)return;
    coppy(arg);
}

template <class klasa1, class klasa2>
AssocTab<klasa1, klasa2>::~AssocTab(){
                      clear();
}

template <class klasa1, class klasa2>
AssocTab<klasa1, klasa2>& AssocTab<klasa1, klasa2>::operator = (const AssocTab &arg){
          clear();
    if (arg.head == 0)return *this;
       coppy(arg);
    return *this;
}

template <class klasa1, class klasa2>
int& AssocTab<klasa1, klasa2>::operator[](klasa1 key){
    if (exist(key))    return find(key);
    return create(key);
}

/*template <class klasa1, class klasa2>
void AssocTab<klasa1, klasa2>::pokaz(){
    if (head == 0)return;
       Node<klasa1, klasa2> *ptr = head;
    while (ptr){
        cout << (ptr->key) << " = " << (ptr->val) << endl;
        ptr = ptr->next;
    }
    cout << endl;
}*/

template <class klasa1, class klasa2>
int& AssocTabN<klasa1, klasa2>::operator[](klasa1 key){
    klasa1 lower=key;
    if (exist(lower)) return find(lower);
    return this->create(lower);
}

int main(){
    AssocTab <string, int>a,*d;
    a["styczen"] = 31;
    a["luty"] = 29;
    a["Luty"] = 11;
    a["lUtY"] = 322;
    a.pokaz();
    AssocTabN <string, int>b,c;
    b["styczen"] = 31;
    b["luty"] = 29;
    b["Luty"] = 11;
    b["lUtY"] = 322;
    b["maj"] = 31;
    b["Zima"] = 666;
    b.pokaz();
    d = &b;
    cout << (*d)["lUty"] << endl;
    b = c;
    c["lUtY"] = 123;
    b["lUtY"] = 456;
    c.pokaz();
    b.pokaz();
    AssocTab<string, int> e;
    a["styczen"] = 5531;
    e.pokaz();
 //   system("PAUSE");
    return 0;
} 

Błędy:

53  37      required from 'void AssocTab<klasa1, klasa2>::pokaz() [with klasa1 = std::basic_string<char>; klasa2 = int]'
179 13      required from here
12  16      [Error] template argument required for 'class AssocTab'
28          recipe for target 'main.o' failed

Jeszcze raz dziękuję za pomoc.
Pozdrawiam,
Makieć

Pozostało 580 znaków

2015-01-23 22:58
0
friend class AssocTab; 

w tym miejscu kompilator nie wie co to jest AssocTab.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0