Home > Mobile >  declare extern class c in hpp file and use it cpp file
declare extern class c in hpp file and use it cpp file

Time:08-17

I have two classes : Individu and Cite and as u can see Individu is defined before

//file.hpp
#include <iostream>
#include <stdexcept>
#include <vector>

extern Cite CITE;


class Individu {
   protected:
       static int id;
       TYPE t;
   public:
       Individu();
       virtual ~Individu();
       static int & getCompteur();
       virtual void afficher(std::ostream& ) const;
       virtual TYPE getType() const;
};

class Cite {
   std::vector<const Individu *> tab;
   public:
       Cite();
       ~Cite();
       void addPersonne(const Individu *);
       int size() const;

};
std::ostream& operator<<(std::ostream&, const Individu& );


#endif

I need to add an Individu one it's instanciated to the tab vector of Cite and sisnce there is just one Cite I declared Exctern CITE Cite to work with just like that :

// file.cpp
#include <algorithm>

#include "file.hpp"




int Individu::id = 0;


Individu::Individu()  {
    CITE.addPersonne(*this);
    id  ;
}

Individu::~Individu(){
    
}

int& Individu::getCompteur() {
    return id;
}


void Individu::afficher(std::ostream& o) const{
    o << id;
}

void Personne::afficher(std::ostream& o) const {
    o << nom << " " << id;
}

std::ostream& operator<<(std::ostream& o, const Individu& i ){
    i.afficher(o);
    return o;
}

TYPE Individu::getType() const {
    throw IllegalException();
}

Cite::Cite(){

}

Cite::~Cite() {

}

void Cite::addPersonne(const Individu * i){
    tab.push_back(i);

}

int Cite::size() const {
    return tab.size();
}

and when I compile I got this error :

file.hpp:13:8: error: ‘Cite’ does not name a type
   13 | extern Cite CITE;
      |        ^~~~
file.cpp: In constructor ‘Individu::Individu()’:
file.cpp:30:5: error: ‘CITE’ was not declared in this scope
   30 |     CITE.addPerconne(*this);
      |     ^~~~
make: *** [makefile:15 : build/deviant.o] Erreur 1

I understand that Cite is not yet defined so that's why I got that error , so hwo can I fix it ?

CodePudding user response:

You have two issues in your code:

  1. extern Cite CITE is declared before the class Cite is defined, so the compiler doesn't know what a Cite is at that point. You should move this declaration after the definition of Cite.
  2. You never define CITE. An extern variable declaration is a promise to the compiler that you will define that variable later. You're essentially saying "I promise a Cite object named CITE exists even though you can't see it right now". You broke that promise by never actually creating that object. You need to define a Cite CITE somewhere (most likely in file.cpp).
  • Related