Fonction inline dans une classe (sous Qt)

Résolu
debutant VB Messages postés 93 Date d'inscription lundi 3 juillet 2006 Statut Membre Dernière intervention 25 juin 2010 - 25 juin 2010 à 18:15
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 25 juin 2010 à 21:40
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

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
25 juin 2010 à 18:30
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]
3
debutant VB Messages postés 93 Date d'inscription lundi 3 juillet 2006 Statut Membre Dernière intervention 25 juin 2010
25 juin 2010 à 21:15
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 ?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
25 juin 2010 à 21:40
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]
0
Rejoignez-nous