наследование — доступ к защищенным статическим членам суперкласса с помощью подклассов в переполнении стека

У меня вопрос. Если у меня есть статический член в суперклассе, как мне разрешить доступ ко всем подклассам этого суперкласса и использовать статический член.

Например.

/*Superclass*/
class Commands {
protected:
static Container database;
};

/*Sub class*/
class Add: public Commands {
public:
void add_floating_entry(std::string task_description);
};

/*This gives me an error. add_floating_task is a method of the Container Class*/
void Add::add_floating_entry(string task_description)
{
database.add_floating_task(task_description);
}

Могу ли я знать, что здесь не так? Заранее спасибо!

РЕДАКТИРОВАТЬ:

Контейнер класса выглядит следующим образом

class Container {
private:
vector<Task_Info*> calendar[13][32];
vector<Task_Info*> task_list;
public:
void add_floating_task(std::string task_description);
};

Ошибка: «Использование необъявленного идентификатора» базы данных »

0

Решение

Определите это static член из объявления класса:

class Commands {
protected:
static Container database; // <-- It's just a declration
};

Container Commands::database; // <-- You should make a definition
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Объявление статического члена данных в его определении класса не является
определение … Должно появиться определение для статического члена данных
в области имен пространства, включающей определение класса члена.

Ваш способ сделать это protected можно сделать его доступным для производных классов.

3

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

Ваш код выглядит нормально, кроме отсутствует определение статической базы данных членов команды.
Вам нужно определить database вне commands учебный класс

Container Commands::database;

§ 9.4.2 Статические члены

Статические члены подчиняются обычным правилам доступа членов класса (статья 11). При использовании в объявлении члена класса, статический спецификатор должен использоваться только в объявлениях члена, которые появляются в спецификации члена определения класса.

Как database является защищенным членом базового класса Commandsпроизводный класс Add должен иметь возможность получить к нему доступ :: оператор или . оператор с объекта.

1

поскольку static Член разделяется между всеми объектами.Commands::database должно быть хорошо.

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