首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算单个派生类的实例数

计算单个派生类的实例数
EN

Stack Overflow用户
提问于 2009-04-21 13:43:28
回答 10查看 5.4K关注 0票数 4

我希望能够计算属于同一类层次结构的类的实例。

例如,假设我有以下内容:

代码语言:javascript
复制
class A;
class B: public A;
class C: public B;

然后我有了这个代码

代码语言:javascript
复制
A* tempA = new A;
B* tempB = new B;
C* tempC = new C;
C* tempC2 = new C;

printf(tempA->GetInstancesCount());
printf(tempB->GetInstancesCount());
printf(tempC->GetInstancesCount());

结果应打印出来

代码语言:javascript
复制
 1
代码语言:javascript
复制
 1
代码语言:javascript
复制
 2

理想情况下,计数应该在内部完成。每个类,而不是某种类型的管理器,都应该知道它有多少实例。

有什么想法吗?

谢谢!

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-04-21 13:54:20

所提出的解决方案存在一个问题:当您创建B时,将自动调用A构造函数,从而递增A的计数。

代码语言:javascript
复制
class A
{
public:
    A(bool doCount = true)
    {
        if (doCount)
            ++instanceCount_;
    }

    static std::size_t GetInstanceCount()
    {
        return instanceCount_;
    }

    virtual ~A(){}
private:
    static std::size_t instanceCount_;
};

class B: public A
{
public:
    B(bool doCount = true):A(false)
    {
        if (doCount)
            ++instanceCount_;
    }

    static std::size_t GetInstanceCount()
    {
        return instanceCount_;
    }
private:
    static std::size_t instanceCount_;
};

std::size_t A::instanceCount_ = 0;
std::size_t B::instanceCount_ = 0;
票数 6
EN

Stack Overflow用户

发布于 2009-04-21 13:48:35

直截了当地告诉我:

  • 在每个类中创建一个整型静态字段。注意在每个(非静态)构造函数体的emulated static constructor.
  • Increment it中,整数overflow.
  • Initialize it为0。

是一个静态函数,它返回整数静态字段的值。

注释:查看Mykola的评论。这将为A打印4,为B打印3,为C打印2,即将B的一个实例计为“一个A和一个B",并将一个C计为”一个A,一个B和一个C“。这在某种程度上是正确的,但并不是问题所要求的。换句话说,我的答案是错误的:)

票数 4
EN

Stack Overflow用户

发布于 2009-04-21 13:55:04

有点“奇怪的重复出现的模板模式”。

代码语言:javascript
复制
template<typename P>
class Counter
{
    public: Counter(bool inc)
        :m_wasInc(inc)
    {
        if (m_wasInc)
        {   getCount()++;}
    }
           ~Counter()
    {
        if (m_wasInc)
        {   getCount()--;}
    }
    static std::size_t GetInstancesCount()
    {
         return getCount();
    }
    private:
       bool m_wasInc;
       /*
        * Alternatively this can be a static member variable.
        * I just used a function because this means I do not need to declare
        * the variable for each type class. The down size is that it becomes
        * more complex if used in the presence of a DLL's.
        *
        * But that is way easy to change. See Alternative Version below.
        */
       static std::size_t& getCount()
       {
           static std::size_t count = 0;
           return count;
       }
};

class A: public Counter<A>
{
    public: A(bool count = true): Counter<A>(count){}
};

class B: public A,Counter<B>
{
    public: B(bool count = true): A(false), Counter<B>(count){}
};

class C: public A, Counter<C>
{
    public: C(bool count = true): A(false), Counter<C>(count){}
};

template<typename P>
class CounterAlt
{
    public: CounterAlt()
    {    ++count;
    }
    static std::size_t GetInstancesCount()
    {
         return count;
    }
    private:
       static std::size_t count;
};

class D: public CounterAlt<D>
{
};
std::size_t CounterAlt<D>::count = 0;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/772655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档