У меня вопрос. Если у меня есть статический член в суперклассе, как мне разрешить доступ ко всем подклассам этого суперкласса и использовать статический член.
Например.
/*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);
};
Ошибка: «Использование необъявленного идентификатора» базы данных »
Определите это static
член из объявления класса:
class Commands {
protected:
static Container database; // <-- It's just a declration
};
Container Commands::database; // <-- You should make a definition
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Объявление статического члена данных в его определении класса не является
определение … Должно появиться определение для статического члена данных
в области имен пространства, включающей определение класса члена.
Ваш способ сделать это protected
можно сделать его доступным для производных классов.
Ваш код выглядит нормально, кроме отсутствует определение статической базы данных членов команды.
Вам нужно определить database
вне commands
учебный класс
Container Commands::database;
§ 9.4.2 Статические члены
Статические члены подчиняются обычным правилам доступа членов класса (статья 11). При использовании в объявлении члена класса, статический спецификатор должен использоваться только в объявлениях члена, которые появляются в спецификации члена определения класса.
Как database
является защищенным членом базового класса Commands
производный класс Add
должен иметь возможность получить к нему доступ ::
оператор или .
оператор с объекта.
поскольку static
Член разделяется между всеми объектами.Commands::database
должно быть хорошо.