作为类数据成员的计数器对象 我正在从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
都具备了该功能