开发通用的物体计数器

时间:2014-04-23 17:45:25

标签: c++ templates inheritance

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

下面,这里是我现在所拥有的声明,这是我的目标:

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

但是有一个问题: 可以使用类名访问GetNumberOfObjects方法: 机:: GetNumberOfObjects()。它看起来好像一切都好,但如果我尝试使用派生类名访问该方法:Tank :: GetNumberOfObjects()或Plain :: GetNumberOfObjects(),则会导致编译问题。 这对用户来说似乎有点混乱。 它很明显为什么会发生。

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

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

问题是:是否有任何替代方案可以提供获取这些计数器而不使用此类功能的唯一方法?

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

有什么想法吗?

提前致谢,希望我的英语可读=)

1 个答案:

答案 0 :(得分:0)

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