2012-04-23 131 views
4

我從模板類繼承。當我在老師課上入學時,我想在科目類&中進入。 我得到一個錯誤使用不完整的類型struct Subect;錯誤:使用不完整的類型struct主題;錯誤:結構的前向聲明主題

void addSubject(Subject *s) { 
      this->addReference(s); 
      s->addReference(this); when I comment this line the it compiles without errors, but I cannot insert into Subject 

     } 

我的整個代碼如下

#include <iostream> 
#include <stdlib.h> 
#include <vector> 

using namespace std; 
class Subject; 


template <class T> 
class abstractReference { 


    vector<T*> list; 
    public: 
    string code; 
     void addReference( T*); 
     void delReference( T*); 
     bool hasReference( T*); 
     T * getReference(int); 
}; 

template <class T> 
void abstractReference<T>::addReference(T* ref) { 
    list.push_back(ref); 
    //ref->addReference(this); 
} 

template <class T> 
void abstractReference<T>::delReference(T* ref) { 
    int i; 
    for (i=0; i<list.size(); i++) { 
     if (list[i]== ref) list.erase(i); 
    } 

} 

template <class T> 
bool abstractReference<T>::hasReference(T* ref) { 
    if (list.size() == 0) return false; 
    int i; 
    for (i=0; i<list.size(); i++) { 
     if (list[i] == ref) return true; 
    } 
    return false; 
} 

template <class T> 
T* abstractReference<T>::getReference(int i) { 
    if (i < 0 || i > list.size()) return NULL; 
    return list[i]; 
} 

class Teacher : public abstractReference<Subject> { 

    string fname; 
    string lname; 
    float sal; 
public: 
    Teacher(string c, string fn, string ln, float s): fname(fn), lname(ln), sal(s) { 
    } 
    Teacher() {sal =0; fname=""; lname="";} 
    void setInfo(string c, string fn, string ln, float s=0.00) { 
     code=c; 
     fname = fn; 
     lname = ln; 
     sal = s; 
    } 

    string getName() { 
     return fname + " " + lname; 
    } 

    float getSal() { 
     return sal; 
    } 

    void addSubject(Subject *s) { 
     this->addReference(s); 
     s->addReference(this); 

    } 

    void delSubject(Subject *s) { 

    } 

}; 

class Subject : public abstractReference<Teacher> { 
    string title; 
public: 
    Subject(string c=NULL, string t=NULL) { 
     title = t; 

    } 
    string getTitle() { 
     return title; 
    } 
}; 

main() { 
    Teacher *t; 
    t = new Teacher("J109", "Dexter", "McConnell",15000); 
    Subject *s, *s1, *s2; 
    s= new Subject("E001", "English"); 
    s1= new Subject("M001", "Maths"); 
    s2= new Subject("s001", "Science"); 

    t->addSubject(s); 
    t->addSubject(s1); 

    cout << "Has Reference " << t->hasReference(s2) << endl; 
    cout << "Done..." << endl; 
    cout << t->getReference(1)->getTitle() << endl; 
} 

回答

2

的問題是,編譯器不知道類型Subject,你可能向前聲明,或忘了包括定義它的頭文件。
其結果是,對於編譯器Subject不完整類型,它不能執行任何操作,它需要知道Subject的佈局,調用它的成員函數就是這樣一個實例。

解決辦法是:

你應該包括在您對定義源CPP文件定義Subject頭文件:你沒有多個文件

void addSubject(Subject *s) 

在的情況下,使確定類別Subject定義爲之前您已定義函數addSubject()

1

當編譯器試圖編譯類TeacherSubject一直沒有定義的是,只有宣佈。因此,編譯器不知道Subject中存在哪些方法。

我的建議是你把函數的主體移動到以下的定義爲Subject

事情是這樣的:

class Teacher : public abstractReference<Subject> { 
    // ... 

    void addSubject(Subject *s); 

    // ... 
}; 

class Subject : public abstractReference<Teacher> { 
    // ... 
}; 

void Teacher::addSubject(Subject *s) { 
    // ... 
}