Доступ к защищенным статическим членам суперкласса подклассами в C ++

0

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

Например

/*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);
};

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

Теги:
polymorphism
inheritance
superclass
subclass

3 ответа

3
Лучший ответ

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

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

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

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

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

  • 0
    Спасибо за вашу помощь. Мне все еще довольно неудобно переключаться с Java на C ++.
1

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

Container Commands::database;

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

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

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню