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

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

最佳答案

还是我的设计完全错误,应该以某种方式进行更改?


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

编辑:计数专业化的侵入性解决方案:

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());
}


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

关于c++ - 跟踪C++中父类(super class)有多少个派生类的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30501077/

10-13 09:37