4

2 つのクラス間に双方向の関連付けを作成したいと考えていました。たとえば、プライベート属性としてclass A持っており、プライベート属性として持っています。class Bclass Bclass A

私が得たエラーは主に次のとおりです。

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

(私はそのようなエラーをたくさん受け取ります)

これらのエラーは、account.h に paymentMode.h を含める方法と関係があると思います。クラスの1つに含まれている1つのインクルードをコメントアウトしようとしましたが、うまくいきました。account と paymentMode クラス間の双方向の関連付けを維持できるうちに、このようなエラーを削除する方法を尋ねてもよろしいですか?

ありがとうございました!

私が書いたコードを添付します。

    //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
4

1 に答える 1

8

循環インクルード依存関係がありますが、この場合、クラスAはクラスBのポインターのコンテナーのみを保持し、その逆も同様であるため、前方宣言を使用して、インクルードを実装ファイルに入れることができます。

だから、代わりに

 #include "account.h"

使用する

class Account;

無関係:using namespace stdヘッダーファイルを入れないでください。可能であれば、どこにも入れないでください。この問題の詳細については、こちらをご覧ください。

于 2013-03-10T15:40:18.750 に答える