Soru Farklı ad alanlarındaki arkadaş sınıfları. Mümkün mü


C ++ arkadaş özelliğini kullanmaya çalışırken sorun yaşıyorum. Bu arayüzlerim var:

#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);
        };

    };

};

ve

#pragma once
#include "GeometryManager.h"

class CGeometryManager3D;
namespace render{

    class CMesh3D
    {
    public:
        friend class tools::sysInput::CGeometryManager3D;
        CMesh3D(void);
        ~CMesh3D(void);
    };

};

Ne olduğunu bilmiyorum ama derleyici tarafından çok fazla hata atılıyor (Visual C ++ 2008). Bunu çözmek mümkün mü?

Düzenle: Yukarıdaki kod, sorunumu göstermek için sahte bir koddur. Çözümünüz bu kod için iyi çalışıyor ancak gerçek kodumda uygulamaya koyduğumda işe yaramadı. Gerçek kod, ne yazık ki aynıdır:

#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_

ve

#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_

Derleyici, "CMesh3D" yazısının bir üyesi olmadığını bildiren bir hata döndürüyor. Yine, herhangi bir yardım edilir. :)

düzenle 2: Her sınıfın ve her iki sınıfın kendi ad alanının bildirimini ileterek çözdüm. Bunun döngüsel bir beyan ile başarısız olacağını düşündüm, ama sonunda mükemmel bir şekilde çalışıyor.

Yardımlarınız için hepinize teşekkürler.


17
2017-10-01 23:42


Menşei


Adlı ilk dosya GeometryManager.h ve adında ikinci dosya Mesh3D.h? Öyleyse, dairesel bir dahil etme sorununuz var. - James McNellis
@James benim düşüncemdi. - San Jacinto
Hayır ... sirkülasyon içermiyor. Bir B ve B içerir A içerir, sen benim kodunda yaptığım gibi, biri diğerinin içine bildirimi ileterek dairesel içerme çözmek. - Killrazor


Cevaplar:


Böyle bir şey biraz daha iyi çalışıp çalışmadığını görün (şimdilik, onları tek bir kaynak dosyada birleştirdim).

#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);
        };

    };

};

26
2017-10-01 23:52



Şu anda yeni oyları beklemek, ancak doğru isim alanı ile ileriye doğru beyanı nitelendirmek kesinlikle doğru çözümdür. - Ben Voigt
Muhtemelen, ad alanı bloklarından sonraki noktalı virgüller gerekli değildir. - Arun
CGeometryManager bildirimini araçlar :: sysInput :: CGeometryManager olarak ileterek test ettim, ama işe yaramadı. Şimdi çalışıyor!! - Killrazor


İkinci dosyada aşağıdaki kodu kaldırmanız gerekiyor:

#include "GeometryManager.h"

class CGeometryManager3D;

İlk satır, sorudaki önerilere göre genel olarak dahil edilmeye neden olur;

İkinci satır, global isim alanında olduğu gibi tamamen alakasız bir sınıf ilan eder;


-3
2017-10-01 23:51



Hayır, işe yaramıyor. - Killrazor