c++ - utilizar - Clases de amigos a través de diferentes espacios de nombres. Es eso posible
tipos de amigos (2)
Supongo que necesitas eliminar el siguiente código en el segundo archivo:
#include "GeometryManager.h"
class CGeometryManager3D;
La primera línea provoca la inclusión circular como lo sugieren los comentarios en la pregunta;
La segunda línea declara una clase totalmente irrelevante como lo es en el espacio de nombres global;
Tengo problemas al intentar usar la función de amigo de C ++. Tengo estas interfaces:
#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);
};
};
};
y
#pragma once
#include "GeometryManager.h"
class CGeometryManager3D;
namespace render{
class CMesh3D
{
public:
friend class tools::sysInput::CGeometryManager3D;
CMesh3D(void);
~CMesh3D(void);
};
};
No sé qué está sucediendo, pero el compilador (Visual C ++ 2008) genera muchos errores. ¿Es posible resolver esto?
editar: El código anterior es un código simulado para mostrar mi problema. Su solución funciona bien con este código, pero cuando lo puse en práctica, mi código real no funcionó. El código real es casi el mismo:
#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_
y
#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_
El compilador devuelve un error que dice "CMesh3D" no es un miembro de render. Una vez más, cualquier ayuda es bienvenida. :)
edición 2: lo he resuelto enviando la declaración de cada clase y su propio espacio de nombres en ambas clases. Pensé que esto debería fallar por declaración circular, pero finalmente funciona perfectamente.
Gracias a todos por la ayuda.
Vea si algo como esto funciona un poco mejor (por el momento, los he fusionado en un solo archivo fuente).
#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);
};
};
}