跟踪超类在C ++中有多少派生类的最佳方法是什么?

时间:2015-05-28 08:26:35

标签: c++ inheritance

我有一个项目,其中一个超类有很多子类。我使用创建随机生成的子类对象的方法,并估计存在多少子类我使用静态变量。我总是想记住增加它。但是,如果其他人开始使用此代码呢?他可能会错过这一步,因此无论他的代码是否正常工作,我的随机测试都会通过。有没有机制来避免这种情况?或者也许我的设计是完全错误的,我应该以某种方式改变它?

编辑: 我知道如何计算创建了多少个对象。我正在寻找一种机制来找出存在多少个子类。

1 个答案:

答案 0 :(得分:2)

  

或许我的设计完全错了,我应该以某种方式改变它?

我认为是。您可以将实例计数保留在类层次结构之外,并通过一组(模板化的)工厂函数来控制它。这将允许您使用此计数系统(或不使用),它将允许您根据需要扩展/自定义它。

修改:计算专业化的侵入式解决方案:

class Base // root of your hierarchy
{
protected:
    Base(char const * const type)
    {
        instances_.insert(type);
    }

    virtual ~Base() = 0;

public:
    static decltype(instances_.size()) CountSpecializations() const
    {
        return instances_.size();
    }

private:
    static std::set<std::string> instances_;
};

/// This is convenience code: clients could simply call 
/// Base(typeid(typename T).name()) on construction, witout it
template<typename T>
class TypedSpecialization: public Base
{
protected:
    TypedSpecialization() : Base(typeid(typename T).name()) {}
};

客户代码:

// actual specialization (w/o TypedSpecialization it would inherit from Base)
class Specialization1: public TypedSpecialization<Specialization1>
{
public:
    Specialization1(): TypedSpecialization<Specialization1>() {}
};

int f()
{
    assert(0 == Base.CountSpecializations());

    Specialization1 s1, s2;
    assert(1 == Base.CountSpecializations());
}

代码实际上并不计算代码库中现有特化的数量,而是计算自应用程序启动以来实例化的不同特化的数量。