CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Simple question C++

Krenian
Krenian
Niveau 35
17 octobre 2021 à 12:33:27

Bonjour :salut:
j'aurai une question en C++ assez simple mais j'arrive pas à la formuler assez bien pour trouver la réponse sur google.
En c++, lorsque nous déclarons une classe, quelle est la différence entre :
template <typename T=int>
class Vecteur
{
private :
T* Tab;
int taille;
protected :
public :
Vecteur(int t){}
void Get(){}
void Print(){}
void operator +=(Vecteur &V2){}
};

et
template <typename T=int>
class Vecteur
{
private :
T* Tab;
int taille;
protected :
public :
Vecteur::Vecteur(int t){}
void Vecteur::Get(){}
void Vecteur::Print(){}
void Vecteur ::operator +=(Vecteur &V2){}
};

?
On m'a dit qu'il fallait toujours faire la première mais j'étais intrigué du fonctionnement derrière

Message édité le 17 octobre 2021 à 12:34:16 par Krenian
CppModerne
CppModerne
Niveau 3
17 octobre 2021 à 12:39:34

La première définie des méthodes inline, la deuxième ne compile pas.

Krenian
Krenian
Niveau 35
17 octobre 2021 à 12:45:47

Le 17 octobre 2021 à 12:39:34 :
La première définie des méthodes inline, la deuxième ne compile pas.

Ok merci je viens de vérifier et en effet ça compile pas.
Je sais pas pourquoi j'étais persuadé qu'il était possible de rediriger la déclaration d'une méthode à sa classe :(

CppModerne
CppModerne
Niveau 3
17 octobre 2021 à 13:03:03

Il est possible de séparer déclaration et définition d'une méthode, pour cela tu dois soit :

  • Créer un fichier source (.cpp) dans lequel tu y inclus ton header (.h) tout en haut, par exemple #include "Vecteur.h", pour ensuite implémenter tes méthodes à l'intérieur de ce fichier. Néanmoins, cela ne fonctionne pas avec des classes et fonctions templates, car le compilateur doit avoir accès au code de la fonction.
  • Tu peux, pour les classes templates, créer des fichiers "inline" (.inl, l'extension est arbitraire tu peux même mettre .krenian). Dans ce fichier tu implémenteras tes fonctions templates en respectant bien la syntaxe du template ! N'oublies surtout pas d'inclure ce fichier ".inl" à la fin de ton fichier ".h", car l'objectif est juste d'indiquer au préprocesseur de copier-coller le contenu de ce fichier à la fin de notre header !

Exemple :

Vecteur.h :

#pragma once
 
template <typename T=int>
class Vecteur
{
private :
T* Tab;
int taille;
protected :
public :
Vecteur(int t);
void Get();
void Print();
void operator +=(Vecteur &V2);
};

#include "Vecteur.inl"

Vecteur.inl :

#include "Vecteur.h"

template <typename T>
Vecteur<T>::Vecteur(int i) {}

template <typename T>
void Vecteur<T>::Get() {}

template <typename T>
void Vecteur<T>::Print() {}

template <typename T>
void Vecteur<T>::operator +=(Vecteur& V2) {}

Voilà !

Krenian
Krenian
Niveau 35
17 octobre 2021 à 14:03:42

Le 17 octobre 2021 à 13:03:03 :
Il est possible de séparer déclaration et définition d'une méthode, pour cela tu dois soit :

  • Créer un fichier source (.cpp) dans lequel tu y inclus ton header (.h) tout en haut, par exemple #include "Vecteur.h", pour ensuite implémenter tes méthodes à l'intérieur de ce fichier. Néanmoins, cela ne fonctionne pas avec des classes et fonctions templates, car le compilateur doit avoir accès au code de la fonction.
  • Tu peux, pour les classes templates, créer des fichiers "inline" (.inl, l'extension est arbitraire tu peux même mettre .krenian). Dans ce fichier tu implémenteras tes fonctions templates en respectant bien la syntaxe du template ! N'oublies surtout pas d'inclure ce fichier ".inl" à la fin de ton fichier ".h", car l'objectif est juste d'indiquer au préprocesseur de copier-coller le contenu de ce fichier à la fin de notre header !

Exemple :

Vecteur.h :

#pragma once
 
template <typename T=int>
class Vecteur
{
private :
T* Tab;
int taille;
protected :
public :
Vecteur(int t);
void Get();
void Print();
void operator +=(Vecteur &V2);
};

#include "Vecteur.inl"

Vecteur.inl :

#include "Vecteur.h"

template <typename T>
Vecteur<T>::Vecteur(int i) {}

template <typename T>
void Vecteur<T>::Get() {}

template <typename T>
void Vecteur<T>::Print() {}

template <typename T>
void Vecteur<T>::operator +=(Vecteur& V2) {}

Voilà !

Donc pour le deuxieme cas,on doit passer par un fichier tiers afin de préciser les templates ?

CppModerne
CppModerne
Niveau 3
17 octobre 2021 à 14:09:18

Oui, mais tu peux également le faire dans le même fichier header (.h), c'est toi qui vois, tant que le code template se situe uniquement dans un header au final peu importe.

Message édité le 17 octobre 2021 à 14:10:18 par CppModerne
Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment