Go Down

Topic: Classes imbriquées, est-ce possible  (Read 152 times) previous topic - next topic

sncf68

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 :

Quote
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 !


kamill

Bonjour,

Oui tu peux définir une class dans une autre class comme ceci:
Code: [Select]
class CLocomotive
{
  public:
  class CFrein
  {
    public:
    float pressionCylindre;
  } frein;
};

CLocomotive locomotive;


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

sncf68

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 ?


kamill

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.

sncf68

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

Code: [Select]
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 :
Code: [Select]

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

Locomotive loco();

void setup(){

}

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

kamill

#5
Sep 15, 2020, 10:16 pm Last Edit: Sep 15, 2020, 10:37 pm by kamill
Les constructeurs sont facultatifs, mais si tu declares des constructeurs, il faut que tu tu les définisses.
.

sncf68

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

Code: [Select]

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

Locomotive loco();

void setup(){

}

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

kamill

Enlèves les parenthèses ici

Locomotive loco();


sncf68

Ok super merci !

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

Bonne soirée !

J-M-L

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 ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up