计数器对象作为类数据成员

时间:2015-08-02 04:51:48

标签: c++

我正在阅读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对象被声明?

3 个答案:

答案 0 :(得分:1)

当创建Widget的新实例时,它是为了增加计数器。

CounterWidget的成员时,只要创建Counter,就会调用Widget的构造函数。这反过来会增加count的{​​{1}}变量的值。

答案 1 :(得分:1)

Counter对象工作的原因是它在构造函数和析构函数中完成了它的工作。如果您希望Widget使用Counter进行计数,则需要确保Widget的构造函数调用Counter的构造函数,以及Widget析构函数调用Counter的析构函数。

您可以通过Counter成为Widget的实例成员来实现此目的。即使Widget从不显式访问Counter的方法,只要CounterCounter的数据成员,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> {    
    .....
};

现在,WidgetFoo都具有此功能。