Ich habe Probleme, die Freundeigenschaft von C++ zu verwenden. Ich habe diese Schnittstellen:Freundschaftsklassen in verschiedenen Namespaces. Ist das möglich
#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);
};
};
};
und
#pragma once
#include "GeometryManager.h"
class CGeometryManager3D;
namespace render{
class CMesh3D
{
public:
friend class tools::sysInput::CGeometryManager3D;
CMesh3D(void);
~CMesh3D(void);
};
};
Ich weiß nicht, was passiert ist, aber eine Menge Fehler werden durch den Compiler (Visual C++ 2008) geworfen. Es ist möglich, das zu lösen?
bearbeiten: Der obige Code ist ein Pseudo-Code, um mein Problem zu zeigen. Ihre Lösung funktioniert gut mit diesem Code, aber wenn ich in meinem realen Code in die Praxis umgesetzt habe, hat es nicht funktioniert. Der eigentliche Code ist neearly gleich:
#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_
und
#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_
Der Compiler einen Fehler zurück, der sagt "CMesh3D" ist kein Mitglied machen. Wieder ist jede Hilfe willkommen. :)
bearbeiten 2: ich es gelöst habe von jeder Klasse und seinen eigenen Namensraum in beiden Klassen Spedition Erklärung. Ich dachte, dass dies per Rundschreiben scheitern sollte, aber es funktioniert schließlich perfekt.
Vielen Dank an alle für die Hilfe.
Ist die erste Datei 'GeometryManager.h' und die zweite Datei' Mesh3D.h'? Wenn dies der Fall ist, liegt ein Problem mit der zirkulären Inklusion vor. –
@James das war mein Gedanke. –
Nein ... es erscheint keine zirkuläre Einschließung. In a includes B und B includes A lösen Sie die zirkuläre Aufnahme, indem Sie die Deklaration einer der Klassen in die andere weiterleiten, wie ich es in meinem Code getan habe. – Killrazor