我希望能够计算属于同一类层次结构的类的实例。
例如,假设我有以下内容:
class A;
class B: public A;
class C: public B;然后我有了这个代码
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());结果应打印出来
1 1 2理想情况下,计数应该在内部完成。每个类,而不是某种类型的管理器,都应该知道它有多少实例。
有什么想法吗?
谢谢!
发布于 2009-04-21 13:54:20
所提出的解决方案存在一个问题:当您创建B时,将自动调用A构造函数,从而递增A的计数。
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;发布于 2009-04-21 13:48:35
直截了当地告诉我:
是一个静态函数,它返回整数静态字段的值。
注释:查看Mykola的评论。这将为A打印4,为B打印3,为C打印2,即将B的一个实例计为“一个A和一个B",并将一个C计为”一个A,一个B和一个C“。这在某种程度上是正确的,但并不是问题所要求的。换句话说,我的答案是错误的:)
发布于 2009-04-21 13:55:04
有点“奇怪的重复出现的模板模式”。
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;https://stackoverflow.com/questions/772655
复制相似问题