2016-07-25 45 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

相关问题