Bonjours,
j'aimerais savoir quand est ce qu'on doit utiliser une structure au lieu d'une classe, et vice versa .
Je pensais qu'une structure ne contient pas de fonction/méthode ...
Merci d'avance pour votre aide.
Bonjours,
j'aimerais savoir quand est ce qu'on doit utiliser une structure au lieu d'une classe, et vice versa .
Je pensais qu'une structure ne contient pas de fonction/méthode ...
Merci d'avance pour votre aide.
Bonsoir,
Les struct et les class sont à peu près équivalents.
Les distinctions sont les suivantes:
- La visibilité par défaut est public pour les structures, private pour les classes.
- Le mode d'héritage par défaut est public pour les structures, private pour les classes.
- L'utilisation en tant que type template est interdite pour struct.
D'accord pour les deux premiers points, mais pas pour le troisième. On peut aussi bien utiliser une stuct qu'une classe comme argument template.
Ou alors tu veux dire qu'on ne peut pas employer le mot clef struct pour déclarer un argument template ?
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
Bonjour,
Précision sur le point 3:
Testé à l'instant g++ (4.2.1) me ressort ça:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 // OK template <class T> struct A { }; // ERREUR template <struct T> struct B { };
test.C:1: error: ‘struct T’ is not a valid type for a template constant parameter
Salut,
Pour le troisième point, je crois qu'il faut mettre les pendules à l'heure...
On ne peut effectivement pas utiliser le mot clé struct pour déclarer un argument template, car seuls les mots clés class et typename sont autorisés.
Par contre, rien n'interdit d'utiliser une structure (comprendre: un type utilisateur déclaré avec le mot clé struct) comme parametre d'implémentation d'un template.
La seule restriction qu'il y a éventuellement (il faudrait que je vérifie), c'est que l'on ne pourra utiliser la structure que si le paramètre template est déclaré avec le mot clé typename (je suis, en tout cas, sur que c'est le cas pour les types primitifs, je suis pris d'un doute en ce qui concerne les structures)
Le code suivant est en effet tout à fait valide:
et montre bien que l'on peut utiliser une structure pour invoquer l'implémentation une fonction ou une classe template
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 struct MyStruct { /*...*/ }; struct MyFunctor { void operator()(MyStruct const & s){/*...*/} }; template <typename functor> void foo(functor & f) { /*...*/ } int main() { std::vector<MyStruct> tab; // implemente std::vector< T> avec T = MyStruct foo(MyFunctor()); // invoque la fonction foo<f> avec f = MyFunctor /*...*/ return 0; }![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
D'accord. En gros : c'est interdit de faire template <struct T>.
Au passage, j'aimerais savoir ce que signifie :
dans :
Code : Sélectionner tout - Visualiser dans une fenêtre à part void operator()(MyStruct const & s){/*...*/}
En fait ce sont les parenthèses après "operator" que je comprends pas... elles signifient quoi ? comment utiliser un opérateur ( ) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 struct MyFunctor { void operator()(MyStruct const & s){/*...*/} };
Si j'ai bien compris, dans le code ci-dessous, on définit ici ce que doit faire l'operateur "==" qui est intuitif => comparrer les deux objets Rectangles.
Merci d'avance pour votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 template<typename T> bool operator==(const Rectangle<T>& a, const Rectangle<T>& b);
On redéfini en effet l'opérateur (). Avec le code que tu as écrit, on peut faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 MyFunctor f; MyStruct s; f(s);
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
Partager