Visibilité en compilation séparée
Bonjour
Je me heurte à un problème en compilation séparée de visibilité entre classes que j’ai simplifié au maximum ainsi :
La classe B
possède seulement une fonction qui renvoie un entier :
Code:
int ret1234 () {return (1234) ;}
B.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #ifndef B_H
#define B_H
class B
{
public:
int ret1234 (void) ;
B();
~B();
};
#endif // B_H |
B.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| #include "B.h"
int B::ret1234 ()
{
return (1234) ;
}
B::B()
{}
B::~B()
{} |
La classe A
fait un #include <B.h>,
instancie dans le constructeur un objet B : {B objB ;},
déclare la fonction de B en externe : extern int ret1234 (void) ;,
et appelle la fonction de B :
Code:
int A::getValB (void) {return (objB.ret1234 ()) ;}
A.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #ifndef A_H
#define A_H
#include <B.h>
extern int ret1234 (void) ;
class A
{
public:
int getValB (void) ;
A();
~A();
};
#endif // A_H |
A.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include "A.h"
int A::getValB (void)
{
return (objB.ret1234 ()) ; // <<<<<<<<<<<<< Le compilateur ne connait pas objB
}
A::A()
{
B objB ; // Instanciation objet classe B
}
A::~A()
{} |
Le main
instancie un objet A : A objA ;,
et appelle la fonction : objA.getValB ().
Main.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include <iostream>
using namespace std;
#include <A.h>
A objA ; // Instanciation objet classe A
int main()
{
cout << "Test visibilite entre classes!" << endl;
cout << objA.getValB () << endl;
return 0;
} |
La compilation sous CodeBlocs me renvoie
Citation:
A.cpp ligne 5 : ‘obj B’ was not declared in this scope.
Je ne comprends pas mon erreur triviale de débutant !
J'ai mis tout ce misérable projet codeBlocs ici :
http://www.voilec.com/medias/200123.rar
Merci par avance
Merci pour ton oeil du tigre
Effectivement, je ne voyais pas cette stupidité dans le constructeur.
J'ai déplacé l'instanciation dans A.cpp et tout marche comme prévu.
Merci encore
Le A.cpp correct :
Code:
1 2 3 4 5 6 7
|
#include "A.h"
B objB ; // Instanciation objet classe B
int A::getValB (void)
{... |