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!!
Version imprimable
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!!
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:
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:
1
2
3
4 class toto { typedef vector< double > titi; };
titi n'est pas un 'nouveau' type mais un synonyme sur vector<double> :Code:
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; }
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:
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.cppCode:
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.cppCode:
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:
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(); */
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:
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: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'erreurCode:
1
2
3
4
5
6 struct matrix { double values[5][6]; }; typedef vector< matrix > ListMatrix;