2013-03-10 4 views
3

Мне хотелось создать двунаправленную связь между двумя классами. Например, class A имеет class B в качестве своего частного атрибута, а class B имеет class A в качестве его частных атрибутов.Двунаправленная связь между двумя классами

Ошибки, которые я получил в основном:

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

(Я получаю такую ​​ошибку)

Я считаю, что эти ошибки должны делать с тем, как я включать paymentMode.h в account.h и наоборот. Я пробовал комментировать одно включение в один из классов, и все работает нормально. Могу ли я спросить, как удалить такие ошибки, пока я все еще могу иметь двунаправленную связь между учетной записью и классом 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 
+1

[Этот вопрос и ответы] (http://stackoverflow.com/questions/14909997/why-arent-my-include-guards-preventing-recursive-inclusion-and-multiple-symbol/14909999#14909999) подробно объясняет, что (первый вопрос/ответ). –

ответ

7

Вы круговое включают зависимость, но в этом случае, так как класс А содержит только контейнер указателей класса B, и наоборот, вы можете использовать вперед деклараций, и положить включает в файлах реализации ,

Таким образом, вместо

#include "account.h" 

использования

class Account; 

Unrelated: Не ставить using namespace std в заголовочных файлах, и если это возможно, нигде. См. here для получения дополнительной информации по этой проблеме.

+0

проблема решена :) никогда не знал, что я могу написать что-то вроде класса Account; в файле заголовка. Благодаря! сегодня узнали что-то новое. Кстати, написав «учетную запись класса» в файле заголовка paymentMode, называется ли это объявлением вперед? – user2114036

+1

@ user2114036, помните, что модель предварительной обработки в C++ заключается в том, что файл '# include'd просто скопирован в том месте, где появляется' # include'. В файле заголовка вы можете написать любой допустимый C++, который вы хотите. Это даже возможно, например, запустите инструкцию в файле '# include'd и завершите ее снаружи. ** Очень ** плохой вкус, но законный (текущие компиляторы, вероятно, предупреждают, он был популярным источником неудачных сбоев компиляции ...). – vonbrand

+0

@ user2114036 Да, это объявление вперед. – juanchopanza

Смежные вопросы