Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problème avec inline...

5 réponses
Avatar
nico
Bonjour,

L'utilisation du mot clef inline provoque des messages d'erreur du linker,
j'ai reproduit le prob avec une classe simple :

//.h
#pragma once

class Complexe
{
private:
double entier, imaginaire;
public:
Complexe();
Complexe(Complexe&);
Complexe(double, double);

~Complexe();

double getPartieEntiere() const;
void setPartieEntiere(double);

double getPartieImg() const;
void setPartieImg(double);

void toString() const;

};

//.cpp
#include "complexe.h"

inline Complexe::Complexe()
: entier(0), imaginaire(0)
{
}

inline Complexe::Complexe(Complexe& c)
: entier(c.entier), imaginaire(c.imaginaire)
{
}

inline Complexe::Complexe(double e, double i)
: entier(e), imaginaire(i)
{
}

inline Complexe::~Complexe()
{
}


inline double Complexe::getPartieEntiere() const
{
return entier;
}

inline void Complexe::setPartieEntiere(double d)
{
entier = d;
}

inline double Complexe::getPartieImg() const
{
return imaginaire;
}

inline void Complexe::setPartieImg(double d)
{
imaginaire = d;
}

inline void Complexe::toString() const
{
std::cout << entier << " + " << imaginaire << "i" << std::endl;
}

Comment cela se fait-il ?

Merci.
--
nico

5 réponses

Avatar
K. Ahausse
"nico" a écrit dans le message de
news:41cffe7d$0$16239$
Bonjour,

L'utilisation du mot clef inline provoque des messages d'erreur du linker,
j'ai reproduit le prob avec une classe simple :

//.h
#pragma once

class Complexe
{
private:
double entier, imaginaire;
public:
Complexe();
Complexe(Complexe&);
Complexe(double, double);

~Complexe();

double getPartieEntiere() const;
void setPartieEntiere(double);

double getPartieImg() const;
void setPartieImg(double);

void toString() const;

};

//.cpp
#include "complexe.h"

inline Complexe::Complexe()
: entier(0), imaginaire(0)
{
}

inline Complexe::Complexe(Complexe& c)
: entier(c.entier), imaginaire(c.imaginaire)
{
}

inline Complexe::Complexe(double e, double i)
: entier(e), imaginaire(i)
{
}

inline Complexe::~Complexe()
{
}


inline double Complexe::getPartieEntiere() const
{
return entier;
}

inline void Complexe::setPartieEntiere(double d)
{
entier = d;
}

inline double Complexe::getPartieImg() const
{
return imaginaire;
}

inline void Complexe::setPartieImg(double d)
{
imaginaire = d;
}

inline void Complexe::toString() const
{
std::cout << entier << " + " << imaginaire << "i" << std::endl;
}



Pris tel quel cela compile sans pb.

Le souci apparait si dans une autre unité de compilation (un autre .cpp) tu
définis une variable de type "complexe". A ce moment-là toutes tes methodes
de classes, etant définies inline, ne sont pas accessible. En supprimant la
définition des methodes de la classe "complexe" du .cpp et en le mettant
dans le header, devrait suffire à supprimer les erreurs.

Avatar
Anthony Fleury
nico wrote:

Bonjour,


Bonjour,

L'utilisation du mot clef inline provoque des messages d'erreur du linker,
j'ai reproduit le prob avec une classe simple :

//.h
#pragma once

class Complexe
{
[...]

};

//.cpp
#include "complexe.h"

inline Complexe::Complexe()
: entier(0), imaginaire(0)
{
}
[...]

Comment cela se fait-il ?


Ca doit être une FAQ ca. Les fonctions inlines doivent être définies partout
où elles sont utilisées, c'est à dire que le code de la fonction doit être
visible dans tous les fichiers où elle est appellée.

Pour des fonctions aussi petites, à la place de mettre du inline partout,
mieux vaut mettre la définition de la fonction dans la classe directement.
Sinon au choix :
- mettre les définitions des fonctions dans le fichier .h de la classe en
dehors de cette classe (genre en dessous de la classe
- les mettres dans un fichier (exemple .inl) qui sera inclu juste derrière
la définition de la classe

Ou même certains s'amusent à inclure le fichier .cpp.

Le même problème existe pour les template avec bon nombre de compilateurs
actuels.

Anthony
--
Alan Turing thought about criteria to settle the question of whether
machines can think, a question of which we now know that it is about as
relevant as the question of whether submarines can swim.
-- Dijkstra

Avatar
nico
Bonjour,

Merci pour les réponses.

En fait je voulais séparer l'interface de la définition pour avoir un code
plus clair (donc mettre les definition ds le cpp) mais bon apparemment ca
pose problème pour les inline je vais donc tout mettre ds le .h.

Merci.

--
nico

nico wrote:
Bonjour,

L'utilisation du mot clef inline provoque des messages d'erreur du
linker, j'ai reproduit le prob avec une classe simple :

//.h
#pragma once

class Complexe
{
private:
double entier, imaginaire;
public:
Complexe();
Complexe(Complexe&);
Complexe(double, double);

~Complexe();

double getPartieEntiere() const;
void setPartieEntiere(double);

double getPartieImg() const;
void setPartieImg(double);

void toString() const;

};

//.cpp
#include "complexe.h"

inline Complexe::Complexe()
entier(0), imaginaire(0)
{

}

inline Complexe::Complexe(Complexe& c)
entier(c.entier), imaginaire(c.imaginaire)
{

}

inline Complexe::Complexe(double e, double i)
entier(e), imaginaire(i)
{

}

inline Complexe::~Complexe()
{
}


inline double Complexe::getPartieEntiere() const
{
return entier;
}

inline void Complexe::setPartieEntiere(double d)
{
entier = d;
}

inline double Complexe::getPartieImg() const
{
return imaginaire;
}

inline void Complexe::setPartieImg(double d)
{
imaginaire = d;
}

inline void Complexe::toString() const
{
std::cout << entier << " + " << imaginaire << "i" << std::endl;
}

Comment cela se fait-il ?

Merci.



Avatar
Vincent Lascaux
En fait je voulais séparer l'interface de la définition pour avoir un code
plus clair (donc mettre les definition ds le cpp) mais bon apparemment ca
pose problème pour les inline je vais donc tout mettre ds le .h.


Généralement, la facon de faire consiste à avoir un #include "fichier.inl" à
la fin de ton fichier.h, et de mettre l'implémentation des fonctions dans
ton fichier.inl

--
Vincent

Avatar
nico
Ok merci ca marche, je retiens cette solution.

--
nico

Vincent Lascaux wrote:
En fait je voulais séparer l'interface de la définition pour avoir
un code plus clair (donc mettre les definition ds le cpp) mais bon
apparemment ca pose problème pour les inline je vais donc tout
mettre ds le .h.


Généralement, la facon de faire consiste à avoir un #include
"fichier.inl" à la fin de ton fichier.h, et de mettre
l'implémentation des fonctions dans ton fichier.inl