代码之家  ›  专栏  ›  技术社区  ›  PeakGen

访问子类中的“受保护”数据时出现“标识符未定义”错误

  •  2
  • PeakGen  · 技术社区  · 11 年前

    请查看以下代码

    游戏对象.h

    #pragma once
    class GameObject
    {
    protected:
        int id;
    
    public:
        int instances;
    
        GameObject(void);
        ~GameObject(void);
    
        virtual void display();
    };
    

    游戏对象.cpp

    #include "GameObject.h"
    #include <iostream>
    
    using namespace std;
    
    static int value=0;
    GameObject::GameObject(void)
    {
        value++;
        id = value;
    }
    
    
    GameObject::~GameObject(void)
    {
    }
    
    void GameObject::display()
    {
        cout << "Game Object: " << id << endl;
    }
    

    圆形.h

    #pragma once
    #include "GameObject.h"
    class Round :
        public GameObject
    {
    public:
        Round(void);
        ~Round(void);
    
    
    };
    

    圆形.cpp

    #include "Round.h"
    #include "GameObject.h"
    #include <iostream>
    
    using namespace std;
    
    
    Round::Round(void)
    {
    }
    
    
    Round::~Round(void)
    {
    }
    
    void display()
    {
        cout << "Round Id: " << id;
    }
    

    我得到了 'id' : undeclared identifier 中的错误 Round 班为什么会这样?请帮忙!

    2 回复  |  直到 11 年前
        1
  •  6
  •   Andy Prowl    11 年前

    在该功能中:

    void display()
    {
        cout << "Round Id: " << id;
    }
    

    您正试图访问名为的变量 id 内部 非成员 作用编译器无法解析该名称,因为 身份证件 不是任何全局或局部变量的名称,因此您会收到一个错误,抱怨没有声明标识符。

    如果你想 display() 的成员函数 Round() ,您应该这样声明:

    class Round : public GameObject
    {
    public:
        Round(void);
        ~Round(void);
        void display(); // <==
    };
    

    并这样定义:

    void Round::display()
    //   ^^^^^^^
    {
        ...
    }
    

    这样,功能 Round::display() 将覆盖虚拟功能 GameObject::display() .

        2
  •  1
  •   pstrjds    11 年前

    您声明了一个名为的全局作用域方法 display 在你的Round.cpp文件中。编辑您的标头和cpp,如下所示:

    圆形.h

    #pragma once
    #include "GameObject.h"
    class Round :
        public GameObject
    {
    public:
        Round(void);
        virtual ~Round(void);
        virtual void display(void);
    
    };
    

    圆形.cpp

    #include "Round.h"
    #include "GameObject.h"
    #include <iostream>
    
    using namespace std;
    
    
    Round::Round(void)
    {
    }
    
    
    Round::~Round(void)
    {
    }
    
    void Round::display()
    {
        cout << "Round Id: " << id;
    }
    

    注意-你应该在GameObject中制作析构函数 virtual