More Effective C++ 26. Limiting Object Instantiations

Counted.h

#pragma once
template<class BeingCounted>
class Counted {
public:
    class TooManyObjects { };
    static size_t objectCount();
protected:
    Counted();
    Counted(const Counted& rhs);
    ~Counted() { --numObjects; }
private:
    static size_t numObjects;
    static const size_t maxObjects;
    void init();
};

template<class BeingCounted>
size_t Counted<BeingCounted>::numObjects = 0;

template<class BeingCounted>
Counted<BeingCounted>::Counted() { init(); };

template<class BeingCounted>
Counted<BeingCounted>::Counted(const Counted<BeingCounted>&) { init(); }

template<class BeingCounted>
void Counted<BeingCounted>::init() {
    if (numObjects >= maxObjects) throw TooManyObjects();
    ++numObjects;
}

Printer.h

#pragma once
#include "Counted.h"
#include <string>

using std::string;

class PrintJob {
public:
    PrintJob() { }
    PrintJob(const string& whatToPrint);
};

class Printer :private Counted<Printer> {
public:
    // pseudo-constructors
    static Printer * makePrinter();
    static Printer * makePrinter(const Printer& rhs);
    ~Printer();
    void submitJob(const PrintJob& job);
    void reset();
    void performSelfTest();
    Counted<Printer>::objectCount;
    Counted<Printer>::TooManyObjects;
private:
    Printer();
    Printer(const Printer& rhs);
};
const size_t Counted<Printer>::maxObjects = 1;
Printer::Printer() { }
Printer::Printer(const Printer& rhs) { }

Printer * Printer::makePrinter() { return new Printer; }

Printer * Printer::makePrinter(const Printer& rhs) { return new Printer(rhs); }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值