IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Vecteur de classes


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 46
    Points : 26
    Points
    26
    Par défaut Vecteur de classes
    Bonsoir,

    J'ai un petit problème que j'ai résolu de manière peu élégante. J'aimerai savoir si c'est la meilleure façon de faire.

    J'ai une classe A qui contient en tant que membre un vecteur de la classe B. Jusque là pas de soucis.
    Dans la classe B j'ai un membre qui contient un vecteur de la classe A. Et là est mon problème.

    Le code suivant ne marche pas. Sous VC++Express2010 j’obtiens
    error C2065: 'ClasseA'*: identificateur non déclaré
    error C2065: 'ClasseB'*: identificateur non déclaré

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #pragma once
    #include "ClasseB.h"
    #include <vector>
    using namespace std;
     
    class ClasseA
    {
    public:
    	ClasseA(void);
    	~ClasseA(void);
     
    	vector<ClasseB> mesClasseB;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #pragma once
    #include "ClasseA.h"
    #include <vector>
    using namespace std;
     
    class ClasseB
    {
    public:
    	ClasseB(void);
    	~ClasseB(void);
     
    	vector<ClasseA> mesClasseA;
    };
    Par contre je lève le problème en déclarant chaque classe ami l'une de l'autre.
    Cependant, comme dit plus haut je ne trouve pas ça élégant. Et je n'ai pas forcément besoin que la classe de l'une puisse accéder aux membres de l'autre.

    Un conseil?
    Merci!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Tu as essayé les déclarations avancées

    Mais quand bien même, ton truc me parait ultra-tordu: en gros le père à un tableau de ses fils (qu'il a eu conjointement avec d'autres pères) et les fils ont un tableau des pères

    Un truc très simple à coder, et qui, au delà de l’aspect mémoire, n'est pas trop méchant à maintenir.

    • Tu vas mettre tous tes objets A et tous tes objets B dans un vecteur (donc 2 vecteurs allA et allB).
    • À voir si tu ne peux pas faire un seul gros vecteur d'objets
    • Dans ta classe A et B tu rajoutes un ID qui correspond à la case où se trouve cet objet dans son tableau.
    • Et tu transformes tes vecteurs mesClasseA et mesClasseB en vecteur d'IDs respectivement de A ou B


    Un ID peut-être de type unsigned char (< 256), unsigned short (< 65536) unsigned int, ou une chaîne de caractères

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    c'est impossible. Et logiquement. A a besoin de B, B a besoin de A.
    Ton architecture est incohérente et irréelle.
    Tu as une pièce (A), où tu mets des meubles (B), et dans chaque meuble tu mets des pièces..
    Si 2 classes ont besoin l'une de l'autre, il y a forcément au moins une des deux qui n'a besoin que d'une référence/pointeur.

    http://cpp.developpez.com/faq/cpp/?p...-une-a-l-autre
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    Hey! Merci pour vos réponses!

    Je ne suis pas sûr que mon architecture soit irréelle.
    Évidemment il s'agit là d'un exemple. Plus exactement, je fais de la simulation numérique en volumes finis.

    En gros la ClasseA pourrait représenter un volume de contrôle et la ClasseB une frontière.
    Le volume de contrôle doit connaitre l'ensemble des frontières qui le définisse.
    Comme la frontière doit connaitre les 2 (au plus) volumes de contrôle qu'elle sépare.

    J'ai besoin (d'un point de vue calcul, résolution des équations de mécanique) qu'une classe puisse faire référence à l'autre et vice-versa. Voilà comment je justifie mon architecture qui ne me semble pas loufoque pour autant .
    Je suis sûr de ce que je veux faire, après cela peut ne pas être correct ou faisable en C++.


    Pour être plus exact, et ça répondra à foetus, L'ensemble des mes objets de ClasseA et ClasseB sont contenus dans 2 vecteurs séparés.
    Pour simplifier l'exemple j'ai utilisé dans ClasseA un vecteur de ClasseB, mais en réalité j'ai mis un vecteur de pointeurs de ClasseB (et vice-versa).
    Mais j'ai toujours la même erreur. Je ne sais pas ce que je dois faire au niveau de mes déclarations.


    EDIT:
    Ok Bousk. Je suis allé voir la page indiquée. Ça à l'air de fonctionner.
    J'ai juste un petit détail qui me gène. Les déclarations ne sont pas symétriques entre la classe A et B.
    Comment dois-je choisir mes déclarations, avec quelle classe je dois faire une déclaration anticipée? Je n'ai pas les connaissances suffisante pour maitriser les conséquences d'un tel choix.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Tu le dis toi-même, suffit de "traduire" tes propos..
    Le volume de contrôle doit connaitre l'ensemble des frontières qui le définisse.
    Comme la frontière doit connaitre les 2 (au plus) volumes de contrôle qu'elle sépare.
    Un volume est défini par des frontières, donc il les possède.
    Une frontière doit connaître les volumes qu'elle sépare, donc elle en a une référence.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Citation Envoyé par pingouin84k Voir le message
    Pour simplifier l'exemple j'ai utilisé dans ClasseA un vecteur de ClasseB, mais en réalité j'ai mis un vecteur de pointeurs de ClasseB (et vice-versa).
    Popop! C'est pas équivalent, justement: pour un vecteur de pointeur on peut utiliser la déclaration anticipée, pour un vecteur d'instances on a besoin du constructeur, donc de la déclaration complète!
    Citation Envoyé par pingouin84k Voir le message
    J'ai juste un petit détail qui me gène. Les déclarations ne sont pas symétriques entre la classe A et B.
    C'est normal, car comme te le faisait remarquer Bousk, la relation conceptuelle entre tes classes n'est pas symétrique non plus.
    Citation Envoyé par pingouin84k Voir le message
    Comment dois-je choisir mes déclarations, avec quelle classe je dois faire une déclaration anticipée? Je n'ai pas les connaissances suffisante pour maitriser les conséquences d'un tel choix.
    Quand utiliser une déclaration anticipée? Dès que tu peux, car ça diminue le couplage, donc ça rend ton code plus maintenable (en plus de l'avantage immédiat d'optimiser les temps de re-compilation après modification). Concrètement, tu peux utiliser la déclaration anticipée tant que tu ne fais que déclarer des pointeur ou références (en tant que variables membres, types d'arguements ou de retour de fonctions). La FAQ explique ça très bien ici: http://cpp.developpez.com/faq/cpp/?p...iers-d-en-tete

Discussions similaires

  1. Réponses: 20
    Dernier message: 25/03/2010, 15h45
  2. template, vecteur de classes perso.
    Par viking1404 dans le forum Langage
    Réponses: 2
    Dernier message: 26/11/2009, 16h27
  3. Problème accès à une méthode d'un vecteur de classe
    Par sebdu94 dans le forum SL & STL
    Réponses: 3
    Dernier message: 30/04/2008, 23h00
  4. vecteur de classe
    Par mohamed amine dans le forum Langage
    Réponses: 21
    Dernier message: 08/12/2006, 12h05
  5. [conception] vecteur de classes
    Par r0d dans le forum C++
    Réponses: 7
    Dernier message: 28/12/2005, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo