4 votes

association bidirectionnelle entre 2 classes

Je souhaite créer une association bidirectionnelle entre 2 classes. Par exemple, je veux créer une association bidirectionnelle entre 2 classes. class A a class B comme son attribut privé et class B a class A comme ses attributs privés.

Les erreurs que j'ai obtenues sont principalement :

Error   323 error C2653: 'Account' : is not a class or namespace name   
Error   324 error C2143: syntax error : missing ';' before '{'

(je reçois des tas d'erreurs de ce type)

Je pense que ces erreurs sont liées à la façon dont j'inclus paymentMode.h dans account.h et vice versa. J'ai essayé de commenter une inclusion dans l'une des classes et les choses fonctionnent bien. Puis-je vous demander comment supprimer ces erreurs tout en conservant l'association bidirectionnelle entre la classe account et la classe paymentMode ?

Merci de votre attention !

Vous trouverez ci-joint les codes que j'ai écrits.

    //paymentMode.h

    #pragma once
    #ifndef _PAYMENTMODE_H
    #define _PAYMENTMODE_H

    #include <string>
    #include <iostream>
    #include <vector>
    #include "item.h"
    #include "account.h"

    using namespace std;

    class PaymentMode
    {
    private:
        string paymentModeName;
        double paymentModeThreshold;
        double paymentModeBalance; //how much has the user spent using this paymentMode;
        vector<Account*> payModeAcctList;

    public:
        PaymentMode(string);
        void pushItem(Item*);

        void addAcct(Account*);

        string getPaymentModeName();
        void setPaymentModeName(string);

        void setPaymentModeThreshold(double);
        double getPaymentModeThreshold();

        void setPaymentModeBal(double);
        double getPaymentModeBal();
        void updatePayModeBal(double);

        int findAccount(string);
        void deleteAccount(string);

    };

    #endif

              //account.h

#pragma once
#ifndef _ACCOUNT_H
#define _ACCOUNT_H

#include <string>
#include <iostream>
#include <vector>
#include "paymentMode.h"

using namespace std;

class Account
{
private:
    string accountName;
    //vector<PaymentMode*> acctPayModeList;
    double accountThreshold;
    double accountBalance; //how much has the user spent using this account.

public:
    Account(string);

    //void addPayMode(PaymentMode*);
    //int findPayMode(PaymentMode*);

    string getAccountName();
    void setAccountName(string);

    void setAccountThreshold(double);
    double getAccountThreshold();

    void setAccountBal(double);
    double getAccountBal();
    void updateAcctBal(double);

};

#endif

8voto

juanchopanza Points 115680

Vous avez une dépendance d'inclusion circulaire, mais dans ce cas, puisque la classe A ne contient qu'un conteneur de pointeurs de la classe B, et vice versa, vous pouvez utiliser des déclarations avancées, et placer les inclusions dans les fichiers d'implémentation.

Ainsi, au lieu de

 #include "account.h"

utiliser

class Account;

Sans rapport : ne pas mettre using namespace std dans les fichiers d'en-tête et, si possible, nulle part. Voir aussi aquí pour en savoir plus sur cette question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X