Bonjour!
Est-il possible de definir une structure a l'interieur de la definition d'une classe?
Dans le cas ou ce n'est pas possible, peut-on definir une structure dans le meme fichier .h que la classe?
Merci d'avance!!
Bonjour!
Est-il possible de definir une structure a l'interieur de la definition d'une classe?
Dans le cas ou ce n'est pas possible, peut-on definir une structure dans le meme fichier .h que la classe?
Merci d'avance!!
Oui
Cela définit la structure titi dans la classe toto
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 class toto { struct titi { int nombre; } };
Oui, la notion 1 classe, 1 fichier est une habitude mais pas une contrainte. Tu fais ce que tu veux.
Merci pour la reponse rapide!!
Et si j'insere un typedef a l'interieur de la classe toto, est-ce que l'ordinateur va le considerer comme une instance de la classe?
Merci pour l'aide!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 class toto { typedef vector< double > titi; };
Oui, dans ce cas, titi est un nouveau type de type "vector de doubles" connu uniquemlent dans la classe toto.
Bonjour,
Le vocabulaire est un peu confus :titi n'est pas une instance de la classe toto mais un type de la classe toto. Une instance, c'est pour un objet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 class toto { typedef vector< double > titi; };
titi n'est pas un 'nouveau' type mais un synonyme sur vector<double> :
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 #include <vector> struct toto { typedef std::vector<double> titi; }; int main() { toto::titi v; std::vector<double> v2; v = v2; // OK std::vector<int> v3; // c'est un nouveau type v = v3; // erreur return 0; }
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Salut,
Oui, il est possible de définir n'importe quel type défini par l'utilisateur (c'est valable pour les structures, mais aussi pour les classes, les unions, les énumérations et les alias de type) à l'intérieur d'une classe.
Il est d'ailleurs possible de le faire non seulement dans une classe, mais aussi dans une structure, ou une union.
Le terme "officiel" de cette pratique est "classe imbriquée" (respectivement structure/union/énmération/alias de type).
En anglais, on parle de "nested class" (respectivement structure,...)
Et, oui, on peut définir cette classe (respectivement structure/union/énumération/alias de type) dans le même fichier d'en-tête.
C'est d'ailleurs conseillé dans le sens où... la définition de la classe se trouve très souvent directement... à l'intérieur de la classe dans laquelle elle est imbriquée.
Il faut également noter que la connaissance de la classe imbriquée dépendra de la visibilité dans laquelle elle (la classe imbriquée) est définie:
La classe imbriquée ne sera utilisable que par la classe dans laquelle elle est imbriquée si elle (la classe imbriquée) est soumise à une accessibilité private:, accessible à la classe dans laquelle elle est imbriquée et aux classe dont la classe dans laquelle elle est imbriquée si elle est soumise à une accessibilité protected: et accessible depuis "n'importe où" sous la forme de classe_imbriquante::classe_imbriquee si elle est soumise à une accessibilité public:
Ainsi tu auras souvent un code proche de
Il est possible de "sortir" la définition de la classe imbriquée de celle dans laquelle elle est imbriquée, afin d'en cacher (si on le juge nécessaire) l'implémentation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 class A { /* private: / protected: / public: */ class subA { /* définition de subA */ }; /* reste de la définition de A */ };
Nous nous contenterons alors de la seule déclaration de la classe imbriquée dans le fichier d'en-tête et nous placerons la définition dans le fichier *.cpp.
Cela imposera cependant certaines restrictions:
Nous pouvons en arrivons donc à un code proche de
- Seule l'utilisation de pointeurs et/ou de références vers cette classe sera autorisée dans le fichier d'en-tête ou dans les fichiers qui l'incluent de manière directe ou indirecte.
- Seul le fichier dans lequel la fonction imbriquée est effectivement définie sera en mesure de travailler réellement avec elle
fichier A.h
fichier A.cpp
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 class A { /* private: / protected : / public : */ class subA; void foo(subA & ); //OK, c'est une référence void bar(subA * ); //OK, c'est un pointeur /* void fun(subA ) ; KO : subA n'est pas défini */ subA & op(); // uniquement si subA est soumise à public: subA * op2(); // uniquement si subA est soumise à public: private: subA * ptr; // OK subA & ref; // OK subA val; // KO }; void freefunction(A::subA &); //uniquement si subA est soumise à public:
fichier onefile.cpp
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
21
22
23
24
25
26
27
28
29
30 #include <a.h> class A::SubA { /* définition de subA */ }; A::A():ptr(new subA) { }; void A::foo(subA & sub) { sub.doSomething(); } void A::bar(subA * ptr) { ptr->doSomething(); } A::subA & A::op() { return *ptr; } A::subA * a::op2() { return ptr; } void freefunction(A::subA & sub) { sub.doSomething() }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #include <a.h> A truc; A::subA * ptr=truc.op2(); //ok, c'est un pointeur A::subA & ref = truc.op(); //ok, c'est une référence freefunction(*ptr); // ok freefunction(ref); // ok /* KO... subA non défini A::subA var; ref.doSomethin;(); ptr->doSomething(); */
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
Merci pour les reponses... En incluant ma structure a l'interieur de la classe, j'ai le code suivant:
Tout est en private et a l'interieur du fichier .h de ma classe 'Leaf'. Mais j'obtient le message d'erreur suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 typedef struct _matrix { double values[5][6]; } matrix; typedef vector< matrix > ListMatrix;
D'ou vient cette erreur vu que je ne manipule que des objets a l'interieur d'une classe?
Code : Sélectionner tout - Visualiser dans une fenêtre à part error: `typedef class std::vector<Leaf::_matrix, std::allocator<Leaf::_matrix> > Leaf::ListMatrix' is private
Merci encore!
PAS DE TYPEDEF SUR LES DEFINITIONS DE TYPE EN C++ :Ensuite, il faudrait que tu nous montre la ligne de code qui provoque l'erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 struct matrix { double values[5][6]; }; typedef vector< matrix > ListMatrix;
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Partager