For some reason I cannot use functions attached to the object I want to use. I added a comment to the line that is not working. As an error I get "Error; pointer to incomplete class type is not allowed" Please help
This is code in dokter.ccp
int counter = 0; for (list<Wielrenner*>::iterator it = wielrenners.begin(); it != wielrenners.end(); it++){ Wielrenner* wielrennerOB = *it; cout << "\nID: " << counter; cout << "List size: " << persons.size() << endl; wielrennerOB->print(); // This is not working counter++; } This is code in wielrenner.h
#ifndef WIELRENNER_H_ #define WIELRENNER_H_ //#include <fstream> #include "persoon.h" #include "Onderzoek.h" class Wielrenner : public Persoon { public: Wielrenner(string, string, Adres, string, Datum, Datum, string, int, float, float, float,list<Onderzoek>* ); ~Wielrenner(void); int getLengte() const; float getGewicht() const; float getVo2max() const; float getMaxVermogen() const; list<Onderzoek> getOnderzoekenList(); void setLengte(int); void setGewicht(float); void setVo2max(float); void setMaxVermogen(float); void voegOnderzoekToeList(Onderzoek); void showOnderzoeksList(); void setOnderzoeksLijst(list<Onderzoek>&); void print(); void printFile(ofstream&); private: int lengte; float gewicht; float vo2max; float maxVermogen; list<Onderzoek> onderzoeken; }; #endif /* WIELRENNER_H_ */ code in wielrenner.CCP
using namespace std; #include <string> #include "Wielrenner.h" /* #include "Onderzoek.h" */ Wielrenner::Wielrenner(string voornaam, string achternaam, Adres adres, string telefoon, Datum datumInDienst, Datum geboorteDatum, string persoonType, int lengte, float gewicht, float vo2max, float maxVermogen,list<Onderzoek>* onderzoeken) : lengte(lengte), gewicht(gewicht), vo2max(vo2max), maxVermogen(maxVermogen), Persoon(voornaam, achternaam, adres, telefoon, datumInDienst, geboorteDatum, persoonType) { } Wielrenner::~Wielrenner(void) { } //setten van gegevens void Wielrenner::setLengte(int newLengte){ lengte = newLengte; } void Wielrenner::setGewicht(float newGewicht){ gewicht = newGewicht; } void Wielrenner::setVo2max(float newVo2max){ vo2max = newVo2max; } void Wielrenner::setMaxVermogen(float newMaxVermogen){ maxVermogen = newMaxVermogen; } void Wielrenner::voegOnderzoekToeList(Onderzoek newOnderzoek){ onderzoeken.push_back(newOnderzoek); } void Wielrenner::showOnderzoeksList(){ int teller=0; for (list<Onderzoek>::iterator it = onderzoeken.begin(); it != onderzoeken.end(); it++){ Onderzoek onderzoekOB = *it; cout << teller << " - "; onderzoekOB.print(); teller++; } } void Wielrenner::setOnderzoeksLijst(list<Onderzoek>& newOnderzoeksLijst){ onderzoeken = newOnderzoeksLijst; } void Wielrenner::print(){ cout << "(" << persoonID << ") Persoon: " << endl; cout << persoonType << endl; cout << voornaam << " " << achternaam << endl; adres.print(); cout << telefoon << endl; cout << "Datum in dienst: "; datumInDienst.print(); cout << "Geboortedatum: "; geboorteDatum.print(); cout << "> Extra wielrenner gegevens: " << endl; cout << "Lengte: " << lengte << endl; cout << "Gewicht: " << gewicht << endl; cout << "vo2max: " << vo2max << endl; cout << "maxVermogen: " << maxVermogen << endl; } void Wielrenner::printFile(ofstream &myfile){ myfile << persoonID << "\n"; myfile << persoonType << "\n"; myfile << voornaam << " " << achternaam << "\n"; adres.printFile(myfile); myfile << telefoon << "\n"; datumInDienst.printFile(myfile); geboorteDatum.printFile(myfile); myfile << lengte << "\n"; myfile << gewicht << "\n"; myfile << vo2max << "\n"; myfile << maxVermogen << "\n"; } // returnen van gegevens int Wielrenner::getLengte() const{ return lengte; } float Wielrenner::getGewicht() const{ return gewicht; } float Wielrenner::getVo2max() const{ return vo2max; } float Wielrenner::getMaxVermogen() const{ return maxVermogen; } list<Onderzoek> Wielrenner::getOnderzoekenList(){ return onderzoeken; } 56 Answers
An "incomplete class" is one declared but not defined. E.g.
class Wielrenner; as opposed to
class Wielrenner { /* class members */ }; You need to #include "wielrenner.h" in dokter.ccp
One thing to check for...
If your class is defined as a typedef:
typedef struct myclass { }; Then you try to refer to it as struct myclass anywhere else, you'll get Incomplete Type errors left and right. It's sometimes a mistake to forget the class/struct was typedef'ed. If that's the case, remove "struct" from:
typedef struct mystruct {}... struct mystruct *myvar = value; Instead use...
mystruct *myvar = value; Common mistake.
You get this error when declaring a forward reference inside the wrong namespace thus declaring a new type without defining it. For example:
namespace X { namespace Y { class A; void func(A* a) { ... } // incomplete type here! } } ...but, in class A was defined like this:
namespace X { class A { ... }; } Thus, A was defined as X::A, but I was using it as X::Y::A.
The fix obviously is to move the forward reference to its proper place like so:
namespace X { class A; namespace Y { void func(X::A* a) { ... } // Now accurately referencing the class`enter code here` } } 0I came accross the same problem and solved it by checking my #includes. If you use QKeyEvent you have to make sure that you also include it.
I had a class like this and my error appeared when working with "event"in the .cpp file.
myfile.h
#include <QKeyEvent> // adding this import solved the problem. class MyClass : public QWidget { Q_OBJECT public: MyClass(QWidget* parent = 0); virtual ~QmitkHelpOverlay(); protected: virtual void keyPressEvent(QKeyEvent* event); }; The problem also occurs when header files are not included explicitly where they are needed, but implicitly through other heading files.
1Check out if you are missing some import.