Classes imbriquées, est-ce possible

Bonjour à tous,

Dans le cadre d'un projet de simulateur de conduite ferroviaire, je souhaite réaliser la chose suivante :

J'aimerais créer un objet "locomotive", qui contient lui même des sous objets "frein", "traction", etc etc, pour pouvoir ensuite avoir accès à des variables liées à ces sous système. C'est surtout dans un objectif de clarté du code que je me demande s'il est possible de créer des classes imbriquées les unes dans les autres. J'aimerais par exemple pouvoir modifier la pression dans les freins de la façon suivante :

locomotive.frein.pressionCylindre = 5;

Sauf que, si j'ai bien compris comment implémenter des classes, je ne trouve pas grand chose à ce sujet (en dehors d'un cours dédié au cpp mais dont les lignes ne semblent pas compiler sous arduino...)

Merci par avance pour votre aide !

Bonjour,

Oui tu peux définir une class dans une autre class comme ceci:

class CLocomotive
{
  public:
  class CFrein
  {
    public:
    float pressionCylindre;
  } frein;
};

CLocomotive locomotive;

Tu peux ensuite faire ce que tu souhaites: locomotive.frein.pressionCylindre = 5;

Re,

Ok merci je vais essayer ça ! Mais du coup faut-il instancier "CFrein" quelque part ? Où c'est le rôle de "frein;" après la définition de la classe dans ton exemple ?

Il est instancié en même temps que la définition de CFrein dans la classe CLocomotive. On aurait pu aussi séparer la définition de CFrein et l'instanciation de frein.

Après test, je me retrouve avec une erreur que j'avais déjà en faisait mes essais au préalable :

fs_main:22:7: error: request for member 'frein' in 'loco', which is of non-class type 'Locomotive()'

  loco.frein.pressionCG = 5;

       ^

exit status 1
request for member 'frein' in 'loco', which is of non-class type 'Locomotive()'

Avec le code suivant :

class Locomotive {
	public:
	Locomotive();
	class Frein {
		public: 
		Frein();
		int pressionCG;
	} frein;
};

Locomotive loco();

void setup(){

}

void loop(){
	loco.frein.pressionCG = 5;
}

Les constructeurs sont facultatifs, mais si tu declares des constructeurs, il faut que tu tu les définisses.
.

Même sans constructeur, l'erreur de compilation est la même...

class Locomotive {
	public:
	class Frein {
		public: 
		int pressionCG;
	} frein;
};

Locomotive loco();

void setup(){

}

void loop(){
	loco.frein.pressionCG = 5;
}

Enlèves les parenthèses ici

Locomotive loco();

Ok super merci !

Je vais creuser un peu ça, notamment pour créer définir des fonctions dans la classe frein...

Bonne soirée !

l'approche me paraît complexe.

vous pourriez avoir une classe Frein, une classe Moteur, une classe Xxx

Une locomotive pourrait avoir 4 instances de type Frein, deux de type Moteur, etc...

Pourquoi imbriquer ? qu'est-ce que vous y gagnez ?