我在尝试使用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);
};
};
};
和
#pragma once
#include "GeometryManager.h"
class CGeometryManager3D;
namespace render{
class CMesh3D
{
public:
friend class tools::sysInput::CGeometryManager3D;
CMesh3D(void);
~CMesh3D(void);
};
};
我不知道发生了什么,但编译器抛出了很多错误(Visual C ++ 2008)。 有可能解决这个问题吗?
编辑:上面的代码是一个显示我的问题的模拟代码。您的解决方案适用于此代码,但是当我在实际代码中实践时,无效。真正的代码几乎是一样的:
#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 _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_
编译器返回一个错误,指出“CMesh3D”不是渲染的成员。 再次,欢迎任何帮助。 :)
编辑2:我已经通过在两个类中转发每个类及其自己的命名空间的声明来解决它。我认为这应该通过循环声明失败,但它最终会完美地运作。
感谢所有人的帮助。
答案 0 :(得分:27)
看看这样的东西是否有效(目前,我已将它们合并为一个源文件)。
#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);
};
};
}
答案 1 :(得分:-3)
我猜您需要删除第二个文件中的以下代码:
#include "GeometryManager.h"
class CGeometryManager3D;
第一行导致循环包含,因为问题中的注释表明;
第二行声明了一个完全无关的类,因为它在全局名称空间中;