erreur: Invalid use of incomplète de type struct Objet; erreur: avant la déclaration de la structure de l'Objet
J'ai hériter d'une classe template. Quand je fais une entrée dans l'enseignant de la classe, je veux faire une entrée dans la classe du sujet & vice-versa.
J'obtiens une erreur Invalid use of incomplète de type struct Subect;
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
}
La totalité de mon code est ci-dessous
#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;
}
OriginalL'auteur Dexter | 2012-04-23
Vous devez vous connecter pour publier un commentaire.
Le problème est que le compilateur ne comprend pas le type de
Subject
, Vous avez probablement hâte a déclaré qu'il ou oublié d'inclure le fichier d'en-tête qui la définit.Le résultat est que pour le compilateur
Subject
est un de type Incomplète et il ne peut pas effectuer toute opération par laquelle il a besoin de savoir la mise en page deSubject
, Appelant sa fonction de membre de est un tel exemple.Solution est:
Vous devez inclure le fichier d'en-tête qui définit
Subject
dans la source du rpc fichier où vous avez la définition de:Dans le cas où vous n'avez pas plusieurs fichiers, assurez-vous que la classe
Subject
est défini avant Vous avez la définition de la fonctionaddSubject()
.OriginalL'auteur Alok Save
Lorsque le compilateur essaie de compiler la classe
Teacher
la classeSubject
n'a pas été défini encore, seulement déclaré. Ainsi, le compilateur ne sait pas quelles méthodes existent dansSubject
encore.Ma suggestion est que vous déplacez le corps de la fonction à ci-dessous la définition de
Subject
.Quelque chose comme ceci:
OriginalL'auteur Some programmer dude