我有一个问题。如果我在超类中有一个静态成员,我如何允许这个超类的所有子类访问并使用静态成员。
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);
};
给出的错误是:“使用未声明的标识符”数据库“
答案 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
应该没问题。