2016-05-30 98 views
0

所以我有2類讓我們稱之爲A類和B,其與這些類的內部對彼此作爲一個函數的參數的參考。當我嘗試着聲明它是這樣的:正向聲明類,類重定義

// A.h (Header guarded) 
namespace ns { 
    class B { // Attempt to forward declare B 
    public: 
     int getRand(); 
    }; 

    class A { 
    public: 
     float a, b; 

     void aFunc(B &b);  
    }; 
} 

// B.h (Header guarded) 
namespace ns { 
    class A { // Attempt to forward declare A 
    public: 
     float a, b; 
    }; 

    class B { 
    public: 
     void bFunc(A &a); 
     int getRand(); 
    }; 
} 

的事情是,當我這樣做,我得到'class' type redefinition錯誤。我一直在尋找解決方案,但仍未找到解決方案。我做對了嗎?我想我不是,你能告訴我我在哪裏做錯了嗎?

+2

不是一個向前聲明你到了那裏那個! 'B類;'會。 – jrok

+0

@jrok嗯,但如果我需要從A訪問B的變量呢?沒有它會產生一個錯誤'不完整的類型是不允許的' – Greffin28

+0

這取決於類。告訴我們更多關於他們以及你想要完成什麼。 – jrok

回答

2

他們不是向前聲明,他們是絕對的定義。

你應該

// A.h (Header guarded) 
namespace ns { 
    class B; // forward declare B 

    class A { 
    public: 
     // Some functions with B references as arguments   
    }; 
} 

而且它同樣爲B.h

根據您的情況,也只是其中推展聲明的類作爲參數的一些成員函數,你可以離開的成員函數的聲明在.h文件中,並提供它們的定義在.cpp文件。如

// A.h (Header guarded) 
namespace ns { 
    class B; // forward declare B 
    class A { 
    public: 
     float a, b; 
     void aFunc(B &b);  
    }; 
} 

// B.h (Header guarded) 
namespace ns { 
    class A; // forward declare A 
    class B { 
    public: 
     void bFunc(A &a); 
     int getRand(); 
    }; 
} 

// A.cpp 
#include "A.h" 
#include "B.h" 
namespace ns { 
    void A::aFunc(B& b) { /* ... */ } 
} 

// B.cpp 
#include "A.h" 
#include "B.h" 
namespace ns { 
    void B::bFunc(A& b) { /* ... */ } 
    int B::getRand() { /* ... */ } 
} 
+0

如果我需要從A訪問B的變量,該怎麼辦?沒有它,它會產生一個錯誤'不完整的類型是不允許的'。 – Greffin28

+0

@ Greffin28 - 請重新讀了關於面向對象的設計和封裝 –

+0

@ Greffin28如果只是它採取向前聲明的類作爲參數的一些成員函數,你可以離開.h文件中的成員函數的聲明,並提供他們在.cpp文件中的定義。 – songyuanyao