我有一个项目,其中一个超类有很多子类。我使用创建随机生成的子类对象的方法,并估计存在多少子类我使用静态变量。我总是想记住增加它。但是,如果其他人开始使用此代码呢?他可能会错过这一步,因此无论他的代码是否正常工作,我的随机测试都会通过。有没有机制来避免这种情况?或者也许我的设计是完全错误的,我应该以某种方式改变它?
编辑: 我知道如何计算创建了多少个对象。我正在寻找一种机制来找出存在多少个子类。
答案 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());
}
代码实际上并不计算代码库中现有特化的数量,而是计算自应用程序启动以来实例化的不同特化的数量。