作为类数据成员的计数器对象 我正在从C++中读取C++中的计数对象: 他定义了一个计数器类: class Counter { public: Counter() { ++count; } Counter(const Counter&) { ++count; } ~Counter() { --count; } static size_t howMany() { return count; } private: static size_t count; }; // This still goes in an // implementation file size_t Counter::count = 0;

作为类数据成员的计数器对象 我正在从C++中读取C++中的计数对象: 他定义了一个计数器类: class Counter { public: Counter() { ++count; } Counter(const Counter&) { ++count; } ~Counter() { --count; } static size_t howMany() { return count; } private: static size_t count; }; // This still goes in an // implementation file size_t Counter::count = 0;,c++,C++,文章说,使用此类的一种方法是作为类数据成员: class Widget { public: ..... // all the usual public // Widget stuff static size_t howMany() { return Counter::howMany(); } private: ..... // all the usual private // Widget stuff Cou

文章说,使用此类的一种方法是作为类数据成员:

class Widget {
public:
    .....  // all the usual public
           // Widget stuff
    static size_t howMany()
    { return Counter::howMany(); }
private:
    .....  // all the usual private
           // Widget stuff
    Counter c;
};

我的问题与表达式
计数器c有关。如果我们使用的是
计数器
的静态方法,为什么在
小部件
中声明了
计数器
对象?

它在那里,以便在创建
小部件
的新实例时增加计数器


计数器
小部件
的成员时,每当创建
小部件
时,就会调用
计数器
的构造函数。这反过来会增加
计数器的
计数
变量的值
计数器

对象工作的原因是它在构造函数和析构函数中执行其工作。如果希望
Widget
使用
Counter
进行计数,则需要确保
Widget
的构造函数调用
Counter
的构造函数,并且
Widget
的析构函数调用
Counter
的析构函数


您可以通过使
计数器
成为
小部件
的实例成员来实现这一点。即使小部件< /代码>永远不应明确地访问<代码>计数器> /C>的方法,但是C++可以确保隐式地调用<代码>计数器>代码>构造函数和析构函数,只要<代码>计数器< /> >是小部件类的数据成员。请注意,使
计数器成为
小部件
静态
成员不会达到相同的目标,因为对
小部件
实例的构造函数和析构函数调用不会路由到其
静态
数据成员。

本文中的实际解决方案有点落伍。您发布的代码仅作为说明的一种方式用于最终目标。这不是真正的解决办法

真正的解决方案是使
计数器
成为类模板

template <typename T>
class Counter {
public:
    Counter() { ++count; }
    Counter(const Counter&) { ++count; }
    ~Counter() { --count; }

    static size_t howMany()
    { return count; }

private:
    static size_t count;
};

template <typename T>
size_t Counter<T>::count = 0; 
模板
班级计数器{
公众:
计数器(){++count;}
计数器(常数计数器&){++count;}
~Counter(){--count;}
静态大小\u t有多少()
{返回计数;}
私人:
静态大小计数;
};
模板
大小\u t计数器::计数=0;
然后,将其用作要计算对象的类的父类

// inherit from Counter to count objects
class Widget: public Counter<Widget> {    
    .....
};
//从计数器继承以计数对象
类小部件:公共计数器{
.....
};
我将此添加为扩展。您链接到的文章中没有此内容

// inherit from Counter to count objects
class Foo: public Counter<Foo> {    
    .....
};
//从计数器继承以计数对象
Foo类:公共计数器{
.....
};
现在,
Widget
Foo
都具备了该功能