2013-10-09 3 views
0

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

E.g.

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

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

EDIT:

Класс Контейнер следующим

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

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

+5

«Это дает мне ошибку». - это не помогает, нет никакой общей ошибки C++. –

+1

Показать определение «Контейнер» и сообщение об ошибке, пожалуйста. – jrok

ответ

3

Определить, что static член из декларации класса:

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

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

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

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

+0

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

1

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

Container Commands::database; 

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

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

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

0

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

Смежные вопросы