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