Классы друзей в разных пространствах имен. Это возможно
У меня возникают проблемы с попыткой использовать функцию friend на С++. У меня есть эти интерфейсы:
#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 С++ 2008). Это можно решить?
edit: Над кодом - макет кода, чтобы показать мою проблему. Ваше решение отлично работает с этим кодом, но когда я практиковал в своем реальном коде, это не сработало. Настоящий код выглядит следующим образом:
#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" не является членом рендеринга.
Опять же, любая помощь приветствуется.:)
edit 2: Я решил его, переадресовывая объявление каждого класса и собственного пространства имен в обоих классах. Я думал, что это должно завершиться круговым объявлением, но оно, наконец, отлично работает.
Спасибо всем за помощь.
Ответы
Ответ 1
Посмотрите, будет ли что-то вроде этого работать немного лучше (на данный момент я объединил их в один исходный файл).
#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);
};
};
};
Ответ 2
Я думаю, вам нужно удалить следующий код во втором файле:
#include "GeometryManager.h"
class CGeometryManager3D;
Первая строка вызывает круговое включение, поскольку замечания в вопросе подсказывают;
Вторая строка объявляет совершенно несущественный класс, как в глобальном пространстве имен;