繁体   English   中英

通用对象计数器的发展

[英]Developing of universal counter of objects

我一直在开发一个类,它将使我能够分别计算我将拥有的任何类的对象。 该类应满足以下要求:完全满足要求(我无需对要计数的任何类的对象进行更改)

下面是我现在所拥有的宣言,也是我的目标:

template< typename T >
class Countable
{
public:
    // template< typename Type > friend size_t GetNumberOfObjects();
//private:
    static size_t GetNumberOfObjects();

protected:
    Countable();
    Countable( const Countable& );  
    ~Countable();

private:
    static size_t numberOfObjects;
};

我们具有类的层次结构:

class Machine   {   };
class Tank: public Machine  {   };
class Plane: public Machine {   };
class Ship: public Machine  {   };

我可以通过以下方式使用“可计数”类:

class Machine: public Countable< Machine >  {   };
class Tank: public Machine, public Countable< Tank >    {   };
class Plane: public Machine, public Countable< Plane >  {   };
class Ship: public Machine, public Countable< Ship >    {   };

int main()
{   
    Tank t;
    Ship s;
    Plane p;

    cout << Countable< Machine >::GetNumberOfObjects() << endl; // total number
    cout << Countable< Tank >::GetNumberOfObjects() << endl; // number of only tanks
    cout << Countable< Plane >::GetNumberOfObjects() << endl; // ...
    cout << Countable< Ship >::GetNumberOfObjects() << endl; // ...

    return 0;
}

但是有一个问题:可以使用类名Machine :: GetNumberOfObjects()访问GetNumberOfObjects方法。 看起来一切正常,但是如果我尝试使用派生类名称访问方法:Tank :: GetNumberOfObjects()或Plain :: GetNumberOfObjects(),则会导致编译问题。 对于用户来说似乎有些混乱。 很清楚为什么会这样。

为了避免这种情况,我执行以下操作:将方法放入私有部分并创建一个外部(朋友)函数。 因此,存在访问对象数量的唯一方法。

template< typename Type >  
size_t GetNumberOfObjects()
{
    return Countable<Type>:: GetNumberOfObjects();
}

问题是:是否有其他实现方法可提供不使用此类功能的唯一方法来获取这些计数器?

考虑到这一点,我理解如果用户使用从Countable-class而不是public的私有继承创建派生类就可以了。 但是我不能让他们这样做。

有任何想法吗?

在此先感谢,希望我的英语能读=)

在这里,您需要使用虚拟继承来打破对GetNumberOfObjects()的歧义调用的联系,或者,您可以尝试使用类型擦除元编程模式并将有问题的函数移至通用基类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM