C++ 如何让 class 依赖命名空间,而那个命名空间又依赖 class?
C++ How to have a class relying on a namespace and that namespace relying on the class?
所以我有一个 class 有一些成员变量,它们是在命名空间中定义的结构的实例,并且同一命名空间中的函数有一个参数,该参数是指向上述实例的指针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'
我已经搜索过这个问题 post 由另一个用户编辑,但我没有成功找到 post。
如果有人对这个问题有疑问并且觉得他们需要给它打个差评,那么还请添加评论说明为什么这是一个糟糕的问题,以帮助我下次避免同样的错误。
提前感谢大家的帮助。
根据您向我们展示的内容,您只需要在 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 的信息,除了它是 class。
考虑包含以下内容的代码:
#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
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
对象,因为它看到完全定义的 class,并且出于同样的原因它也可以实例化 SomeClass
.
所以我有一个 class 有一些成员变量,它们是在命名空间中定义的结构的实例,并且同一命名空间中的函数有一个参数,该参数是指向上述实例的指针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'
我已经搜索过这个问题 post 由另一个用户编辑,但我没有成功找到 post。
如果有人对这个问题有疑问并且觉得他们需要给它打个差评,那么还请添加评论说明为什么这是一个糟糕的问题,以帮助我下次避免同样的错误。
提前感谢大家的帮助。
根据您向我们展示的内容,您只需要在 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 的信息,除了它是 class。
考虑包含以下内容的代码:
#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
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
对象,因为它看到完全定义的 class,并且出于同样的原因它也可以实例化 SomeClass
.