2010-10-01 7 views
15

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.

+0

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. –

+0

@James das war mein Gedanke. –

+0

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

Antwort

26

Sehen Sie, wenn etwas wie dieses ein bisschen besser funktioniert (für den Moment habe ich sie in eine einzige Quelldatei zusammengeführt).

#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

Momentan warten auf neue Stimmen, aber die Vorwärtsdeklaration mit der richtigen Namespace-Eindämmung zu qualifizieren ist definitiv die richtige Lösung. –

+1

Wahrscheinlich sind die Semikolons nach den Namespace-Blöcken nicht erforderlich. – Arun

+0

Ich habe mit der Weiterleitung der Deklaration von CGeometryManager als Tools :: sysInput :: CGeometryManager getestet, aber es hat nicht funktioniert. Jetzt funktioniert es!! – Killrazor

-3

Ich denke, Sie benötigen folgenden Code in der zweiten Datei zu entfernen:

#include "GeometryManager.h" 

class CGeometryManager3D; 

Die erste Zeile bewirkt, dass kreisförmige Aufnahme, wie die Kommentare in der Frage suggeriert;

Die zweite Zeile deklariert eine völlig irrelevante Klasse wie im globalen Namensraum;

+0

Nein, es funktioniert nicht. – Killrazor

Verwandte Themen