跨不同名称空间的好友类。可能吗 我在尝试使用C++的朋友特性时遇到了问题。我有以下接口: #pragma once #include "Mesh3D.h" #include <string> namespace tools{ namespace sysInput{ class CGeometryManager3D { public: bool loadFromFile(render::CMesh3D& mesh, std::string filename); CGeometryManager3D(void); ~CGeometryManager3D(void); }; }; }; 我不知道发生了什么,但是编译器中有很多错误(Visual C++ 2008)。strong>有可能解决这个问题吗?
编辑:以上代码是一个模拟代码,用于显示我的问题。您的解决方案对这段代码很有效,但当我在实际代码中付诸实践时,它就不起作用了。真正的代码几乎是一样的:跨不同名称空间的好友类。可能吗 我在尝试使用C++的朋友特性时遇到了问题。我有以下接口: #pragma once #include "Mesh3D.h" #include <string> namespace tools{ namespace sysInput{ class CGeometryManager3D { public: bool loadFromFile(render::CMesh3D& mesh, std::string filename); CGeometryManager3D(void); ~CGeometryManager3D(void); }; }; }; 我不知道发生了什么,但是编译器中有很多错误(Visual C++ 2008)。strong>有可能解决这个问题吗?,c++,namespaces,friend,C++,Namespaces,Friend,编辑:以上代码是一个模拟代码,用于显示我的问题。您的解决方案对这段代码很有效,但当我在实际代码中付诸实践时,它就不起作用了。真正的代码几乎是一样的: #ifndef _ZELESTE_IO_GEOMETRY_MANAGER_H_ #define _ZELESTE_IO_GEOMETRY_MANAGER_H_ #include "ResourceLocationManager.h" #include <string> #include "../../render/C3DMesh.h"
#ifndef _ZELESTE_IO_GEOMETRY_MANAGER_H_
#define _ZELESTE_IO_GEOMETRY_MANAGER_H_
#include "ResourceLocationManager.h"
#include <string>
#include "../../render/C3DMesh.h"
namespace tools{
namespace sysInput{
class CGeometryManager
{
private:
CGeometryManager(void);
~CGeometryManager(void);
static CGeometryManager* m_instance;
public:
static CGeometryManager* getInstance();
bool load3DGeometryFromFile(render::C3DMesh* mesh, const std::string filename);
};
};
};
#endif //_ZELESTE_IO_GEOMETRY_MANAGER_H_
\ifndef\uZeleste\uIO\uGeometry\uManager\uH_
#定义几何图形管理器_
#包括“ResourceLocationManager.h”
#包括
#包括“../../render/C3DMesh.h”
名称空间工具{
命名空间sysInput{
类CGeometryManager
{
私人:
CGeometryManager(无效);
~CGeometryManager(无效);
静态CGeometryManager*m_实例;
公众:
静态CGeometryManager*getInstance();
bool load3DGeometryFromFile(渲染::C3DMesh*网格,常量std::字符串文件名);
};
};
};
#endif/\u ZELESTE\u IO\u几何体\u管理器\u H_
及
\ifndef\u C3D\u网格\u H_
#定义C3D网格_
#包括“Mesh.h”
#包括“./tools/io/GeometryManager.h”
#包括
名称空间工具{
命名空间系统输入{
类CGeometryManager;
}
}
命名空间呈现{
C3DMesh类
:公共CMesh
{
公众:
朋友类工具::sysInput::CGeometryManager;
C3DMesh(无效);
~C3DMesh(无效);
};
};
#endif/\u C3D\u网格\u H_
编译器返回一个错误,说明“CMesh3D”不是render的成员。
同样,欢迎任何帮助。:)
编辑2:我通过转发两个类中每个类的声明及其自己的名称空间解决了这个问题。我认为这应该通过循环声明失败,但它最终完美地工作了
感谢大家的帮助。我想您需要删除第二个文件中的以下代码:
#include "GeometryManager.h"
class CGeometryManager3D;
如问题中的评论所示,第一行导致循环包含
第二行声明了一个完全无关的类,因为它位于全局名称空间中 看看这样做是否更好(目前,我已经将它们合并到一个源文件中)
#包括
名称空间工具{
命名空间系统输入{
类CGeometryManager3D;
}
}
命名空间呈现{
类CMesh3D
{
公众:
朋友类工具::sysInput::CGeometryManager3D;
CMesh3D(无效);
~CMesh3D(无效);
};
}
名称空间工具{
命名空间系统输入{
类CGeometryManager3D
{
公众:
bool loadFromFile(render::CMesh3D&mesh,std::string filename);
CGeometryManager3D(无效);
~CGeometryManager3D(无效);
};
};
}
第一个文件名为GeometryManager.h
,第二个文件名为Mesh3D.h
?如果是的话,你有一个循环包含问题。没有。。。没有出现环状包涵体。在a includes B和B includes a中,您可以通过将一个类别的声明转发到另一个类别来解决循环包含问题,就像我在代码中所做的那样。目前正在等待新的投票,但使用正确的命名空间包含限定转发声明肯定是正确的解决方案。可能,命名空间块后的分号不是必需的。我已经通过将CGeometryManager的声明转发为tools::sysInput::CGeometryManager进行了测试,但它不起作用。现在它工作了!!
#ifndef _C3D_MESH_H_
#define _C3D_MESH_H_
#include "Mesh.h"
#include "../tools/io/GeometryManager.h"
#include <string>
namespace tools{
namespace sysInput{
class CGeometryManager;
}
}
namespace render{
class C3DMesh
:public CMesh
{
public:
friend class tools::sysInput::CGeometryManager;
C3DMesh(void);
~C3DMesh(void);
};
};
#endif // _C3D_MESH_H_
#include "GeometryManager.h"
class CGeometryManager3D;
#include <string>
namespace tools {
namespace sysInput {
class CGeometryManager3D;
}
}
namespace render {
class CMesh3D
{
public:
friend class tools::sysInput::CGeometryManager3D;
CMesh3D(void);
~CMesh3D(void);
};
}
namespace tools {
namespace sysInput{
class CGeometryManager3D
{
public:
bool loadFromFile(render::CMesh3D& mesh, std::string filename);
CGeometryManager3D(void);
~CGeometryManager3D(void);
};
};
}