繁体   English   中英

C ++如何让一个类依赖于一个名称空间,而那个名称空间依赖于该类?

[英]C++ How to have a class relying on a namespace and that namespace relying on the class?

因此,我有一个带有一些成员变量的类,这些成员变量是在名称空间中定义的结构的实例,并且在同一名称空间中的函数具有一个参数,该参数是指向上述类的实例的指针。

看起来像:

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;

我通过添加前向声明“ class 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'

我已经搜索了另一位用户发布的此问题,但是我一直没有找到合适的帖子。

如果有人对此问题有疑问,并认为他们需要对它进行严重打分,那么还请添加注释,说明为什么这是一个不好的问题,可以帮助我下次避免同一错误。

预先感谢大家的帮助。

根据显示的内容,您只需要在SomeNamespace.h中对SomeClass进行前向声明,而不需要完整的包含:

#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的任何知识。

如果确实需要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

考虑包含以下内容的代码:

#include "SomeClass.h"

处理SomeClass.h时,将创建#define保护。 然后,打开并处理SomeNamespace.h。 它的保护已创建。 然后,重新处理SomeClass.h-仅存在警戒并阻止任何定义。 这就是编译器生成未定义错误的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM