显然非静态成员函数可以读取静态数据。事实上,这是拥有静态数据的重要一点 - 因此实例成员函数可以读取它。
但是,有一个很好的理由(从OOP设计的角度来看)具有非静态成员函数 UPDATE 静态数据变量吗?
我知道一个简单的例子,说明人们如何想要反击我们已经创建了多少特定对象的实例。所以我们可以让构造函数更新一个静态int计数器。像这样
class Foo
{
static int ctr;
Foo()
{
ctr++;
}
}
但除了这个具体的例子,是否有一个很好的一般原因,有非静态函数更新静态变量?
就我个人而言,我认为这似乎有点傻,但我无法指出究竟是什么困扰我。
答案 0 :(得分:3)
排序。您可能有工作人员,如果他们被复制,他们应该抛弃任务,您可以通过一组静态的进程内任务进行检查来实现这一目的。
这种静态使用的问题是它意味着每个程序只能有一个这样的类。如果较大程序的所有者想要两次运行这个课程怎么办?哎呀。或者,如果您的程序的另一部分决定它真的可以将此任务管理系统用于其他内容,该怎么办?哎呀。任何小程序都可以成为保存线程和其他资源的大型程序的一部分(我特别习惯于JVM本身非常昂贵的Java上下文)。
因此,当您认为自己需要此模式时,请尝试使用伞形类将候选静态数据作为非静态数据,并为许多子实例设置一个伞类实例。 e.g。
class Worker {
static set<WorkItem*> inProcess; // the old way of doing it
void work(WorkItem* w) {
inProcess.add(w);
}
应该成为
class Worker {
Manager* manager; // shared between all instances, until your program grows
void work(WorkItem* w) {
manager->accept(w);
}
}
class Manager {
set<WorkItem> inProcess;
void accept(WorkItem* w) {
inProcess.add(w);
}
}
此问题适用于任何静态非常量数据。但随着数据从只读变为读写,问题变得越来越危险。 Singleton is an anti-pattern
答案 1 :(得分:0)
从书中
思考C ++,第1卷,第2版,Bruce Eckel,MindView,Inc。总裁。
C ++中的静态成员
有时您需要一个存储空间供所有人使用 一个类的对象。在C中,您将使用全局变量,但这是 不太安全。任何人都可以修改全局数据,其名称可以 与大型项目中的其他相同名称冲突。这将是理想的 如果数据可以存储为全局,但隐藏在内部 一个班级,与该班级明确相关。这是完成的 使用类中的静态数据成员。有一块 静态数据成员的存储,无论有多少对象 你创建的那个类。所有对象共享相同的静态存储空间 对于该数据成员,因此它是一种与他们“沟通”的方式 彼此。但是静态数据属于类;它的名字是 范围内的类,它可以是公共的,私有的或受保护的。