Sharpless512
Sharpless512

Reputation: 3232

Pointer to incomplete class type is not allowed

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

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++;
}   

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_ */

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;
}

Upvotes: 86

Views: 314515

Answers (6)

Matthis Kohli
Matthis Kohli

Reputation: 1995

Check the #includes. If you use a class, you have to include its header.

For example: QKeyEvent, you have to make sure that you also #include <QKeyEvent>.

I had a class like this, and my error appeared when working with QEvent *event in the .cpp file.

myfile.h:

#include <QKeyEvent> // adding this include solved the problem.
   
class MyClass : public QWidget
{
    Q_OBJECT

public:
    MyClass(QWidget* parent = 0);
    virtual ~QmitkHelpOverlay();
protected:
    virtual void  keyPressEvent(QKeyEvent* event);
};

Upvotes: 3

Ahmed Omer
Ahmed Omer

Reputation: 31

The problem also occurs when header files are not included explicitly where they are needed, but implicitly through other heading files.

Upvotes: 3

zeroDivider
zeroDivider

Reputation: 1089

Check out if you are missing some import.

Upvotes: 1

Jeff Weichers
Jeff Weichers

Reputation: 81

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`
  }
}

Upvotes: 8

Bryan Wilcutt
Bryan Wilcutt

Reputation: 345

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.

Upvotes: 19

KRyan
KRyan

Reputation: 7608

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

Upvotes: 159

Related Questions