Доступ к переменной-члену внутри переопределенной функции базового класса

Как получить доступ к переменным-членам внутри переопределенной функции базового класса?

//Overridden base class function
void handleNotification(s3eKey key){
//Member variable of this class
keyPressed = true; //Compiler thinks this is undeclared.
}

Complier жалуется, что keyPressed не объявлено. Единственный способ выяснить, как получить к нему доступ — объявить keyPressed как открытую статическую переменную, а затем использовать что-то вроде:

ThisClass::keyPressed = true;

Что я делаю неправильно?

// Добавлены детали ———————————————- ————-

ThisClass.h:

include "BaseClass.h"
class ThisClass: public BaseClass {
private:
bool keyPressed;
};

ThisClass.cpp:

include "ThisClass.h"
//Overridden BaseClass function
void handleNotification(s3eKey key){
//Member variable of ThisClass
keyPressed = true; //Compiler thinks this is undeclared.
}

BaseClass.h:

class BaseClass{
public:
virtual void handleNotification(s3eKey key);
};

BaseClass.cpp

include 'BaseClass.h"
void BaseClass::handleNotification(s3eKey key) {
}

-3

Решение

Правильный способ переопределения функции заключается в следующем.

class base {
protected:
int some_data;
virtual void some_func(int);
public:
void func(int x) { some_func(x); }
};

void base::some_func(int x)
{ /* definition, may be in some source file. */ }

class derived : public base
{
protected:
virtual void some_func(int);  // this is not base::some_func() !
};

void derived::some_func(int x)
{
some_data = x; // example implementation, may be in some source file
}

редактировать Обратите внимание, что base::some_func() а также derived::some_func() две разные функции, причем последние имеют приоритет над первым.

1

Другие решения

Этот метод определен вне определения класса? Другими словами, ваш код структурирован так:

class ThisClass {
...
};

// method defined outside of the scope of ThisClass declaration, potentially
// in a completely different file
void handleNotification(s3eKey key) {
....
}

Если это так, вам нужно объявить метод следующим образом:

void ThisClass::handleNotification(s3eKey key){
keyPresssed = true;
}

В противном случае компилятор не будет знать, что handleNotification() Реализуемый метод является тот, который принадлежит ThisClass, Скорее, он будет предполагать, что это не часть ThisClass реализации, поэтому он не будет иметь автоматического доступа к ThisClassпеременные.

2

По вопросам рекламы [email protected]