【问题标题】:c++ implementing base class that counts instances of derived classc ++实现计算派生类实例的基类
【发布时间】:2017-11-30 08:59:01
【问题描述】:

我想创建一个基类来帮助我存储一些关于类本身的信息。这些变量之一是实例计数器。它计算类的实例。

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

我想要什么:

  • 计数器应该可以工作,而无需在派生类中执行任何操作,而不是从基类派生
  • 该方法不需要太多的处理能力或内存。

我尝试过的:

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

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

【问题讨论】:

标签: c++ inheritance


【解决方案1】:

模板类怎么样,比如:

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...
};

【讨论】:

  • 是否可以使用单个基类(即模板)而不需要额外的计数器类来实现这一点?
  • 如果我理解正确,您可以使用class MyClass : Counter&lt;MyClass&gt; {};。但是如果你也有MyClass2 : Counter&lt;MyClass2&gt;,它们就没有共同的基础了。
  • 我的意思是我不想定义一个名为“counter”的类。我只想使用“base”,因为“base”还包括实例 Counter。为此制作2个课程不是我想做的事情,因为它令人困惑。对不起,我第一次没有说对:(
  • 您可以拥有:template &lt;typename Derived&gt; struct Base : Counter&lt;Base&lt;Derived&gt;&gt; {} 或将Counter 重命名为Base(但如果您拥有其他功能,则违反了“一类,一项责任”的原则)。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 2013-02-12
    • 2014-04-27
    • 1970-01-01
    • 2023-03-19
    • 2015-03-23
    • 2023-02-22
    • 2021-08-24
    相关资源
    最近更新 更多