我正在阅读Scott Meyers的C ++中的Counting Objects:this。
他定义了一个Counter
类:
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;
文章说使用这个类的一种方法是作为类数据成员:
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;
};
我的问题与Counter c;
这个词有关。如果我们使用Counter
的静态方法,为什么Counter
内的Widget
对象被声明?
答案 0 :(得分:1)
当创建Widget
的新实例时,它是为了增加计数器。
当Counter
是Widget
的成员时,只要创建Counter
,就会调用Widget
的构造函数。这反过来会增加count
的{{1}}变量的值。
答案 1 :(得分:1)
Counter
对象工作的原因是它在构造函数和析构函数中完成了它的工作。如果您希望Widget
使用Counter
进行计数,则需要确保Widget
的构造函数调用Counter
的构造函数,以及Widget
析构函数调用Counter
的析构函数。
您可以通过Counter
成为Widget
的实例成员来实现此目的。即使Widget
从不显式访问Counter
的方法,只要Counter
是Counter
的数据成员,C ++就会确保隐式调用Widget
的构造函数和析构函数。 Counter
课程。请注意,使static
Widget
Widget
成员static
无法实现相同的目标,因为var express = require('express');
var router = express.Router();
var moviesModel = require("../models/movies");
/* GET /movies/ listing. */
router.get('/', function(req, res, next) {
moviesModel.find({}).where('Price').gt(10000).exec(function(err,movies){
if(err) throw err;
console.log(movies);
});
});
module.exports = router;
实例上的构造函数和析构函数调用不会路由到其<div class='leftColumn col'> ... </div>
<div class='rightColumn col'> ... </div>
<div class='centerColumn col'> ... </div>
<div class='clearFloats'></div>
.col { width:32%; }
.leftColumn { float:left; }
.rightColumn { float:right; }
.centerColumn { margin:0 auto; }
.clearFloats { clear:both; font-size:0; line-height: 0; height:0;}
1}}数据成员。
答案 2 :(得分:1)
真正的解决方案在文章中有点下线。您发布的代码仅作为说明手段的最终目标。这不是真正的解决方案。
真正的解决方案是让Counter
成为一个类模板。
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;
然后,将它用作要为其计算对象的类的父类。
// inherit from Counter to count objects
class Widget: public Counter<Widget> {
.....
};
我将此作为扩展程序添加。这不会出现在您链接的文章中。
// inherit from Counter to count objects
class Foo: public Counter<Foo> {
.....
};
现在,Widget
和Foo
都具有此功能。