我有一个项目,其中超类具有很多子类。我使用创建随机生成的子类对象的方法,并使用静态变量来估计存在多少个子类。我试图记住总是增加它。但是,如果有人开始使用此代码怎么办?他可能会错过这一步骤,因此无论他的代码是否工作正常,我的随机测试都将通过。有什么机制可以避免这种情况?还是我的设计完全错误,应该以某种方式进行更改?
编辑:
我知道如何计算创建了多少个对象。我正在寻找一种机制来找出存在多少个子类。
最佳答案
还是我的设计完全错误,应该以某种方式进行更改?
我觉得是这样的。您可以将实例保持在类层次结构之外,并通过一组(模板化的)工厂函数对其进行控制。这将允许您使用(或不使用)此计数系统,并允许您根据需要扩展/自定义它。
编辑:计数专业化的侵入性解决方案:
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/