Fonction inline dans une classe (sous Qt) [Résolu]

Signaler
Messages postés
93
Date d'inscription
lundi 3 juillet 2006
Statut
Membre
Dernière intervention
25 juin 2010
-
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
-
Bonjour tout le monde,

Pour des raisons d'optimisation de rapidité, j'aimerais rendre quelques petites fonctions d'une de mes classes en inline, mais ça ne marche pas : voici un code simplifié qui illustre mon problème :

----- main.cpp : -----

#include <conio.h>

#include "test.h"

int main(int argc, char *argv[])
{
MaClasse test;
test.dire_bonjour();
getch();
return 0;
}

----- test.h : -----

#ifndef TEST_H
#define TEST_H

#include <stdio.h>

class MaClasse {
public:
inline void dire_bonjour(void) const;
};

#endif // TEST_H

----- test.cpp : -----

#include "test.h"

void MaClasse::dire_bonjour(void) const
{
printf("Bonjour !\n");
}

Erreur : "release/main.o:main.cpp::-1: error: undefined reference to `MaClasse::dire_bonjour() const'"
En retirant le "inline" de ce programme, la compilation (et l'exécution) fonctionnent à nouveau sans problème ...
J'ai aussi remarqué qu'en mettant tout dans un seul fichier, cela re-marchait, même avec le inline : le code ci-dessous ne pose pas de problème.

----- main.cpp -----

#include <stdio.h>
#include <conio.h>

class MaClasse {
public:
inline void dire_bonjour(void) const;
};

void MaClasse::dire_bonjour(void) const
{
printf("Bonjour !\n");
}

int main(int argc, char *argv[])
{
MaClasse test;
test.dire_bonjour();
getch();
return 0;
}

Serait-ce possible de rendre la fonction de ma classe inline tout en étant accessible à l'extérieur du fichier ?

Merci d'avance !

3 réponses

Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Il faut que tu utilises les hxx !

Le code "inliné" tout comme les templates, ne peut se trouver dans un fichier source. Or par définition on ne met pas de code dans un header. La solution est donc celle-ci:

Avoir un fichier source (.cc, .cpp)
Avoir un fichier header (.hh, .hpp)
Avoir un fichier de code header (.hxx)

Je te donne un exemple:

Test.hh
#ifndef TEST_HH_
# define TEST_HH_

class Test
{
// ...
  void pouet();
  void truc();
};

# include "Test.hxx"

#endif /* !TEST_HH_ */


Test.hxx
inline void
Test::pouet()
{
//...
}


Test.cc
#include "Test.hh"

void
Test::pouet()
{
//...
}


main.cc
#include "Test.hh"

void main()
{
  Test t;

  t.pouet();
  t.truc();

  return 0;
}



_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Messages postés
93
Date d'inscription
lundi 3 juillet 2006
Statut
Membre
Dernière intervention
25 juin 2010

Ah d'accord, merci beaucoup, je n'avais pas pensé à mettre mon code dans un header. Mais sinon ça marche quand même si je mets tout directement dans mon test.h (sans utiliser de .hxx) même si c'est peut-être pas beau à voir ? :D
C'est comme ça qu'il font dans les librairies (stdio.h ...) non ?
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
librairie => bilbliothèque (librairie est un faux ami du mot anglais library)

On ne met pas tout dans le .hh, c'est très très moche. stdio.h c'est du C, soit dit en passant :p
A noter que mettre du code dans une définition de classe, force l'inlining de celui-ci. Donc si tu veux maîtriser ton code, on met le code en dehors de la classe avec le choix des méthodes qui seront "inlinées" ou non.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]