在C ++中通过子类访问Superclass的受保护静态成员

时间:2013-10-09 08:37:51

标签: c++ inheritance polymorphism subclass superclass

我有一个问题。如果我在超类中有一个静态成员,我如何允许这个超类的所有子类访问并使用静态成员。

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

我可以知道这里有什么问题吗?提前谢谢!

编辑:

Container类如下

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

给出的错误是:“使用未声明的标识符”数据库“

3 个答案:

答案 0 :(得分:3)

在类声明中定义static成员:

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

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

在其类定义中声明静态数据成员不是   定义......应出现静态数据成员的定义   在包含成员类定义的命名空间范围内。

使其成为protected的方法可以使派生类可以访问它。

答案 1 :(得分:1)

除了缺少静态命令成员数据库的定义外,您的代码看起来还不错。 您需要在database

之外定义commands
Container Commands::database;

§ 9.4.2静态成员

  

静态成员遵守通常的类成员访问规则(第11条)。当在类成员的声明中使用时,静态说明符只能用在类定义的成员规范中出现的成员声明中。

由于database是基类Commands的受保护成员,派生类Add应该能够由::运算符或.运算符从对象

答案 2 :(得分:0)

由于static成员在所有对象之间共享。Commands::database应该没问题。