跨不同命名空间的朋友类。那可能吗

问题描述 投票:19回答:2

我在尝试使用C ++的好友功能时遇到了问题。我有这些接口:

#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 C ++ 2008)。有可能解决这个问题吗?

编辑:上面的代码是一个模拟代码来显示我的问题。您的解决方案适用于此代码,但是当我在实际代码中实践时,无效。真正的代码几乎是一样的:

#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”不是render的成员。再次,欢迎任何帮助。 :)

编辑2:我通过在两个类中转发每个类的声明和它自己的命名空间来解决它。我认为这应该通过循环声明失败,但它最终完美无缺。

感谢大家的帮助。

c++ namespaces friend
2个回答
27
投票

看看这样的东西是否有效(目前,我已将它们合并为一个源文件)。

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

    };    
}

-3
投票

我想你需要在第二个文件中删除以下代码:

#include "GeometryManager.h"

class CGeometryManager3D;

第一行导致循环包含,因为问题中的评论表明;

第二行声明了一个完全无关的类,因为它在全局名称空间中;

© www.soinside.com 2019 - 2024. All rights reserved.