[英]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的任何知识。
如果确实需要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
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.