2016-07-25 48 views
1

所以我有一些成員變量是一個命名空間中定義的結構的實例的類,並且該同一命名空間內的函數具有一個參數是一個指向上述類的一個實例。C++如何擁有一個依賴於名稱空間的類以及依賴於該類的名稱空間?

這看起來像:

SomeClass.h

#ifndef SOME_CLASS_H 
#define SOME_CLASS_H 

include "SomeNamespace.h" 

class SomeClass 
{ 
private: 
    SomeNamespace::SomeStructure instance1, instance2; 

    ... 

SomeNamespace.h

#ifndef SOME_NAMESPACE_H 
#define SOME_NAMESPACE_H 

#include "SomeClass.h" 

namespace SomeNamespace 
{ 
    namespace AnotherNamespace 
    { 
     void SomeFunction(SomeClass *pSomeClass); 
    } 

    struct SomeStructure 
    { 
     ... 
    } 
    ... 

我收到的錯誤:

Error C2065 'SomeClass': undeclared identifier 
Error C2653 'SomeNamespace' : is not a class or namespace name 

相關的第一個錯誤:

void SomeFunction(SomeClass *pSomeClass); 

第二誤差涉及:

SomeNamespace::SomeStructure instance1, instance2; 

我通過添加前向聲明固定在第一錯誤 '類SomeClass的;'該文件的頂部:

SomeNamespace.h

#ifndef SOME_NAMESPACE_H 
#define SOME_NAMESPACE_H 

#include "SomeClass.h" 

class SomeClass; 

namespace SomeNamespace 
{ 
    namespace AnotherNamespace 
    { 
     void SomeFunction(SomeClass *pSomeClass); 
    } 

    struct SomeStructure 
    { 
     ... 
    } 
    ... 

我試圖修正錯誤二做同樣的事情的命名空間和結構:

SomeClass.h

#ifndef SOME_CLASS_H 
#define SOME_CLASS_H 

include "SomeNamespace.h" 

namespace SomeNamespace 
{ 
    struct SomeStructure; 
} 

class SomeClass 
{ 
private: 
    SomeNamespace::SomeStructure instance1, instance2; 

    ... 

做命名空間上向前聲明和結構中給了我這些錯誤:

'SomeClass::instance1' uses undefined struct 'SomeNamespace::SomeStructure' 
'SomeClass::instance2' uses undefined struct 'SomeNamespace::SomeStructure' 

我已經搜索了這個問題發表其他用戶,但我一直不成功的定位後。

如果任何人有這個問題的問題,感覺他們需要嚴重評分,那麼也請添加評論,爲什麼它是一個糟糕的問題,以幫助我避免下次犯同樣的錯誤。

謝謝大家提前對您有所幫助。

+0

經典。請搜索SO遞歸包含或頭文件組織。 –

+0

請注意,您的'SomeStructure'前向聲明僅在名稱空間SomeNamespace內,而不在SomeNamespace :: AnotherNamespace內,SomeClass正在嘗試使用它。 –

+1

喬希這是一個打字錯誤,而不是實際的代碼是如何。感謝您指出這一點,我編輯了主要帖子來反映這一點。 – MikeO

回答

4

根據您告訴我們什麼,你只需要SomeClass的在SomeNamespace.h預先聲明,不是一個完整的包括:

#ifndef SOME_NAMESPACE_H 
#define SOME_NAMESPACE_H 

// #include "SomeClass.h" // << don't do this. 

class SomeClass; 

namespace SomeNamespace 
{ 
    namespace AnotherNamespace 
    { 
     void SomeFunction(SomeClass *pSomeClass); 
    } 

以上是有效的,因爲一個指針到SomeClass的沒有按」除了它是一個類以外,還需要了解有關SomeClass的任何內容。

+0

請注意,遞歸包括被刪除。 –

+1

我已經嘗試過這一點,並在SomeFunction定義中,我調用SomeClass的成員函數我得到一個錯誤,指出:'左側的<函數名稱>必須指向類/結構/聯盟/泛型類型' – MikeO

+1

我固定通過將#include「Company.h」添加到.cpp文件。謝謝您的回答。 – MikeO

0

考慮包含代碼:

#include "SomeClass.h" 

當SomeClass.h被處理時,將創建的#define後衛。然後打開並處理SomeNamespace.h。它的守衛被創造出來。然後SomeClass.h被重新處理 - 只有守衛存在並且阻止任何定義。這就是編譯器生成未定義錯誤的原因。

1

如果你真的需要在SomeStructureSomeClass之間循環引用,你可以使用指針,因爲基礎類型不必事先完全定義。

SomeNamespace.h:

#ifndef SOME_NAMESPACE_H 
#define SOME_NAMESPACE_H 

#include "SomeClass.h" 

namespace SomeNamespace { 
    namespace AnotherNamespace { 
     void SomeFunction(SomeClass *pSomeClass); 
    } 
    struct SomeStructure { 
    }; 
} 

#endif 

SomeClass.h:

#ifndef SOME_CLASS_H 
#define SOME_CLASS_H 

namespace SomeNamespace { 
    struct SomeStructure; 
} 

class SomeClass { 
private: 
    SomeNamespace::SomeStructure *pInstance1, *pInstance2; 
public: 
    SomeClass(SomeNamespace::SomeStructure *pInstance1, SomeNamespace::SomeStructure *pInstance2) 
     : pInstance1(pIntance1), pInstance2(pInstance2) {} 
}; 

#endif 

main.cpp中:

#include "SomeNamespace.h" 
#include "SomeClass.h" 

int main(int argc, char* argv[]) { 
    SomeNamespace::SomeStructure *pInstance1 = new SomeNamespace::SomeStructure(); 
    SomeNamespace::SomeStructure *pInstance2 = new SomeNamespace::SomeStructure(); 
    SomeClass someClass(pInstance1, pInstance2); 
    return 0; 
} 

在這個例子中,main.cpp中可以創建你SomeStructure對象,因爲它看到完全定義的類,並且它也可以爲了相同的原因實例化SomeClass

+0

還要注意,'SomeStructure'和'SomeClass'完全定義後''pInstance1''和'pInstance2'的創建也可能發生在'SomeClass.cpp'內部。 –

+1

謝謝你的幫助。 – MikeO

相關問題