Ошибка «Идентификатор не определена» при доступе к «защищенным» данным в подклассе

Пожалуйста, ознакомьтесь со следующим кодом

<�Сильный> GameObject.h

#pragma once
class GameObject
{
protected:
    int id;

public:
    int instances;

    GameObject(void);
    ~GameObject(void);

    virtual void display();
};

<�Сильный> GameObject.cpp

#include "GameObject.h"
#include 

using namespace std;

static int value=0;
GameObject::GameObject(void)
{
    value++;
    id = value;
}


GameObject::~GameObject(void)
{
}

void GameObject::display()
{
    cout << "Game Object: " << id << endl;
}

<�Сильный> Round.h

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


};

<�Сильный> Round.cpp

#include "Round.h"
#include "GameObject.h"
#include 

using namespace std;


Round::Round(void)
{
}


Round::~Round(void)
{
}

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

Я получаю код 'id': uneclared identifier в классе Round . Почему это? Пожалуйста помоги!

1
nl ja de
display не объявляется как метод внутри класса Round , поэтому он не может получить доступ к id .
добавлено автор Nate Kohl, источник

2 ответы

В этой функции:

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

Вы пытаетесь получить доступ к переменной с именем id внутри функции non-member . Компилятор не может разрешить это имя, потому что id не является именем глобальной или локальной переменной, поэтому вы получаете сообщение об ошибке, заявляя, что идентификатор не был объявлен.

Если вы хотите сделать display() функцию-член Round() , вы должны были объявить ее как таковую:

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

И определил его так:

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

Таким образом, функция Round :: display() переопределит виртуальную функцию GameObject :: display() .

4
добавлено
Спасибо за ответ. поэтому, чтобы переопределить отображение() в gameobject, мне нужно переопределить его int Round.h?
добавлено автор Yohan Weerasinghe, источник
Спасибо за ответ . Я очень ценю это :)
добавлено автор Yohan Weerasinghe, источник
@Yohan: Сначала вам нужно объявить его в определении класса Round , а затем вам нужно предоставить определение для него. Как в моем ответе. Вы также можете встроить определение непосредственно в определение класса: class Round {public:/* ... */void display() {cout << "Round id:" << id; }};
добавлено автор Andy Prowl, источник
@Yohan: Пожалуйста, рад, что я мог бы помочь!
добавлено автор Andy Prowl, источник

В файле Round.cpp вы объявили глобально ограниченный метод с именем display . Измените заголовок и cpp следующим образом:

Round.h

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

};

Round.cpp

#include "Round.h"
#include "GameObject.h"
#include 

using namespace std;


Round::Round(void)
{
}


Round::~Round(void)
{
}

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

Note - you should make the destructor in GameObject virtual

1
добавлено
Спасибо за ответ. +1 от меня :)
добавлено автор Yohan Weerasinghe, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest