Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ I';我很难弄清楚如何访问嵌套类之外的变量 嵌套类无法访问类外部的非静态元素_C++ - Fatal编程技术网

C++ I';我很难弄清楚如何访问嵌套类之外的变量 嵌套类无法访问类外部的非静态元素

C++ I';我很难弄清楚如何访问嵌套类之外的变量 嵌套类无法访问类外部的非静态元素,c++,C++,嵌套类有点问题,正如我提供的代码所示,已经声明了2个类,嵌套类实体位于类游戏的私有字段内,出于某种原因,嵌套类不允许我访问它之外的变量map\u info。 我只找到了一个解决方案,它涉及在实体类中创建游戏类的实例 我试着做了一件事 将map_info声明为静态类型(无法解决此问题) 在嵌套类中声明游戏类的实例 我在这里搜索了相同的问题,但结果不符合我的原始代码,但是可能有一点机会,我错过了什么,如果是这样,请发送链接 这是我在这个网站上的第一个问题,所以请尽可能多地提供反馈,哪怕是最轻微的

嵌套类有点问题,正如我提供的代码所示,已经声明了2个类,嵌套类
实体
位于类
游戏
的私有字段内,出于某种原因,嵌套类不允许我访问它之外的变量
map\u info
。 我只找到了一个解决方案,它涉及在实体类中创建游戏类的实例



我试着做了一件事
  • 将map_info声明为静态类型(无法解决此问题)
  • 在嵌套类中声明游戏类的实例
  • 我在这里搜索了相同的问题,但结果不符合我的原始代码,但是可能有一点机会,我错过了什么,如果是这样,请发送链接


    这是我在这个网站上的第一个问题,所以请尽可能多地提供反馈,哪怕是最轻微的反馈都会得到感谢!谢谢

    这不是你想要的。嵌套类只是游戏类的类成员,如果是公共类,则可以作为
    Game::NestedName
    访问,如果是私有类,则不能在非类中访问。比如说

    #包括
    班级游戏
    {
    公众:
    游戏(){};
    void spawnewPrivateEntity(双x、双y、双z)
    {
    private_entities.push_back(PrivateEntity{x,y,z});//访问private成员PrivateEntity是正确的
    }
    struct PublicEntity{double x,y,z;};//可以从任何地方访问公共嵌套结构
    void-newPublicEntity(PublicEntity)
    {
    公共实体。推回(实体);
    }
    私人:
    struct PrivateEntity{double x,y,z;};//只能在此类或友元成员内使用私有嵌套结构
    std::vector private_entities={};
    std::vector public_entities={};
    }
    int main()
    {
    auto en=Game::PublicEntity{0.0,9.0,1.9};//有效
    auto en2=Game::PrivateEntity{0.0,0.0,0.0};//不工作:此结构是Game类的私有成员
    } 
    
    你可以这样做:

    类游戏
    {
    公众:
    游戏(标准::字符串映射信息):映射信息(映射信息)
    {};
    std::string getMapInfo(){return map_info;}
    私人:
    std::字符串映射信息;
    };
    类实体
    {
    公众:
    实体(游戏*游戏):游戏(游戏)
    {};
    无效检查()
    {
    如果(游戏->getMapInfo()!=“无”){/*一些代码*/}
    };
    私人:
    游戏*游戏;
    }
    
    您不能直接访问外部类的成员,您需要一个提供实例的参数。
    玩家
    需要知道从
    游戏
    的哪个实例获取
    地图信息
    。这种知识不是自动产生的。
    玩家
    实例和
    游戏
    实例之间没有隐含的联系。假设你有一个class
    实体
    对象,位于class
    游戏
    实体的任何实例之外,那么
    实体
    将引用什么变量?编译器不知道您不打算这样做。
    实体
    对象需要知道它们应该引用的是
    游戏
    的哪个实例。您真的需要嵌套类吗?使用单独的类可以解决这个问题。另外,独立(非嵌套)类增加了可重用性。
    map\u info
    是类
    Game
    的成员。必须有
    游戏
    对象才能有
    地图信息
    。此代码从不创建或提及
    游戏
    对象,因此没有
    地图信息
    嵌套类只是类,只能在游戏类内部使用
    嵌套类也可以在该类外部使用。访问限定符可以阻止对它的访问,但这与嵌套的类无关。
    class Game
    {
    private:
        std::string map_info;
    
    
        class entity
        {
        protected:
            double x, y, z;
        public:
        };
        class player : public entity
        {
        private: std::string name;
            player(std::string _name) : name(_name) {};
            void check()
            {
                /*
                    this is the portion of the code that i'm having problem with
                    the error: "a nonstatic member reference must be relative to a specific object"
    
                */
                if (map_info != 'none')
                {
                    // do stuff
                }
            }
        };
    
    public:
        std::string Getmap() { return map_info; }
        Game() //constructor
        {
            // does stuff
        }
    };