c ++实现计算派生类实例的基类

时间:2017-11-30 08:59:01

标签: c++ inheritance

我想创建一个基类,帮助我存储有关类本身的一些信息。其中一个变量是实例计数器。它计算类的实例。

通常我会使用一个静态成员变量,我在调用基本构造函数时增加,在调用基本析构函数时减少。问题是不会为每个派生类重新创建静态成员变量。相反,访问是继承的,使得它不是一个单独的计数器,而只是计算继承的基类的数量。 那不是我的目标。

我想要的是什么:

  • 除了从基础
  • 派生之外,计数器应该在派生类中不必做任何事情
  • 该方法不需要太多处理能力或内存。

我尝试过:

  • 使用静态成员(显然失败)
  • 使用普通会员(显然失败,从一开始就很清楚)

做这种事的正确方法是什么。

2 个答案:

答案 0 :(得分:2)

模板类如何:

template <typename Derived, typename ... Bases>
class Counter : Bases... {
public:
    Counter() { ++count; }
    Counter(const Counter& rhs) : Bases(rhs)... { ++count; }
    Counter(Counter&& rhs)  : Bases(std::move(rhs))...{ ++count; }

    ~Counter() { --count; }

private:
    static std::size_t count;
};

template <typename Derived, typename ... Bases>
std::size_t Counter<Derived, Bases...>::count = 0;

所以你的课程将是

class MyClass : Counter<MyClass, Base>
{
    // Implementation...
};

答案 1 :(得分:0)

你必须为计数器使用原子变量。

如果必须使用没有原子支持的C ++ 03。有boost :: atomic,或直接调用操作系统: