Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++如何依赖命名空间和命名空间依赖于类?_C++_Class_Struct_Namespaces_Forward Declaration - Fatal编程技术网

C++如何依赖命名空间和命名空间依赖于类?

C++如何依赖命名空间和命名空间依赖于类?,c++,class,struct,namespaces,forward-declaration,C++,Class,Struct,Namespaces,Forward Declaration,因此,我有一个类,其中包含一些成员变量,这些变量是命名空间中定义的结构的实例,同一命名空间中的函数有一个参数,该参数是指向上述类实例的指针 这看起来像: 某个班级 #ifndef SOME_CLASS_H #define SOME_CLASS_H include "SomeNamespace.h" class SomeClass { private: SomeNamespace::SomeStructure instance1, instance2; ... #ifnde

因此,我有一个类,其中包含一些成员变量,这些变量是命名空间中定义的结构的实例,同一命名空间中的函数有一个参数,该参数是指向上述类实例的指针

这看起来像:

某个班级

#ifndef SOME_CLASS_H
#define SOME_CLASS_H

include "SomeNamespace.h"

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

    ...
#ifndef SOME_CLASS_H
#define SOME_CLASS_H

include "SomeNamespace.h"

namespace SomeNamespace
{
    struct SomeStructure;
}

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
    {
        ...
    }
    ...
#ifndef SOME_NAMESPACE_H
#define SOME_NAMESPACE_H

#include "SomeClass.h"

class SomeClass;

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"

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

    struct SomeStructure
    {
        ...
    }
    ...
#ifndef SOME_NAMESPACE_H
#define SOME_NAMESPACE_H

#include "SomeClass.h"

class SomeClass;

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

    struct SomeStructure
    {
        ...
    }
    ...
我尝试修复错误2,对命名空间和结构执行相同的操作:

某个班级

#ifndef SOME_CLASS_H
#define SOME_CLASS_H

include "SomeNamespace.h"

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

    ...
#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的信息,而只需要知道它是一个类。

根据您向我们展示的内容,您只需要SomeNamespace中的SomeClass的前向声明。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 );
    }

上述内容是有效的,因为指向某个类的指针不需要知道某个类的任何信息,而只需要知道它是一个类。

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

#include "SomeClass.h"

处理SomeClass.h时,将创建define保护。然后打开并处理SomeNamespace.h。它的守卫被创造出来了。然后重新处理SomeClass.h-只有保护存在并阻止任何定义。这就是编译器生成未定义错误的原因。

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

#include "SomeClass.h"

处理SomeClass.h时,将创建define保护。然后打开并处理SomeNamespace.h。它的守卫被创造出来了。然后重新处理SomeClass.h-只有保护存在并阻止任何定义。这就是编译器生成未定义错误的原因。

如果确实需要SomeStructure和SomeClass之间的循环引用,则可以使用指针,因为不必事先完全定义基础类型

SomeNamespace.h:

#ifndef SOME_NAMESPACE_H
#define SOME_NAMESPACE_H

#include "SomeClass.h"

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

#endif
某些类别。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。

如果确实需要SomeStructure和SomeClass之间的循环引用,您可以使用指针,因为不必事先完全定义基础类型

SomeNamespace.h:

#ifndef SOME_NAMESPACE_H
#define SOME_NAMESPACE_H

#include "SomeClass.h"

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

#endif
某些类别。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。

经典。请搜索递归包含或头文件组织。Josh这是一个键入错误,而不是实际的代码。谢谢你指出这一点,我编辑了主要帖子来反映这一点。大卫,你知道解决方案吗?这就是问题所在,但我不知道如何解决it@MikeO可以对指向未定义类型的指针使用前向声明,但不能对未定义类型本身使用前向声明。这里的正常方法是声明SomeNamespace::SomeStructure*instance1,instance2;。当然,这意味着instance1和instance2必须动态分配。我也已经有了drescherjmA classic的转发声明。请搜索递归包含或头文件组织。Josh这是一个键入错误,而不是实际的代码。谢谢你指出这一点,我编辑了主要帖子来反映这一点。大卫,你知道解决方案吗?这就是问题所在,但我不知道如何解决it@MikeO可以对指向未定义类型的指针使用前向声明,但不能对未定义类型本身使用前向声明。这里的正常方法是声明SomeNamespace::SomeStructure*instance1,instance2;。当然,这意味着必须动态分配instance1和instance2。我也已经有了转发声明drescherjmNote,递归include被删除。我尝试过这一点,在SomeFunction定义中,我调用SomeClass的成员函数时,我得到一个错误,声明:“左的必须指向class/struct/union/generic type',我通过将include Company.h添加到.cpp文件中修复了它。谢谢你的回答。注意递归包含被删除了。我已经尝试过了,在SomeFunction定义中,我调用了SomeClass的成员函数,得到了一个e
错误说明:“左边的必须指向class/struct/union/generic type”,我通过将include Company.h添加到.cpp文件中修复了该错误。感谢您的回答。请注意,在完全定义SomeStructure和SomeClass之后,pInstance1和pInstance2的创建也可能发生在SomeClass.cpp内部。请注意,在完全定义SomeStructure和SomeClass之后,pInstance1和pInstance2的创建也可能发生在SomeClass.cpp内部。