【发布时间】:2013-02-24 10:03:30
【问题描述】:
ObjectInfo 类是一个诊断类,用于跟踪统计数据,例如生命周期和对象数量。如图所示,一个特定的类继承自 ObjectInfo。然后在分析类的主体中声明该特定类的成员。
虽然该解决方案有效,但很难维护,因为它要求分析类与分析类保持同步,因为类名用于标识后者。也很难扩展分析类来收集不同的信息,例如对象的大小。
提出一个更好的解决方案,其中分析类和分析类之间的依赖关系最小。
是否有可能实现一个检查来确定所分析类的对象是在堆栈还是堆上创建的?
-- ObjectInfo.h--
#pragma once
class ObjectInfo
{
public:
ObjectInfo(const char* objectName);
virtual ~ObjectInfo(void);
private:
static int m_counter;
int m_objectNumber;
const char* m_className;
};
-- ObjectInfo.cpp--
#include "StdAfx.h"
#include "ObjectInfo.h"
#include <iostream>
#include "TimePrinter.h"
using namespace std;
int ObjectInfo::m_counter = 0;
ObjectInfo::ObjectInfo(const char* name) :
m_className(name)
{
m_objectNumber = ++m_counter;
cout << "Object: " << m_className << "# " << m_objectNumber << " created @ " <<
TimePrinter()<< endl;
}
ObjectInfo::~ObjectInfo(void)
{
cout << "Object: " << m_className << "# " << m_objectNumber << " destroyed @ " <<
TimePrinter() << endl;
}
-- 使用模式--
struct _AInfo : public ObjectInfo {
_AInfo() : ObjectInfo("_A") {}
};
struct _A {
_AInfo m_info;
};
我原本以为这个问题是在询问使用 C++ 反射技术来收集运行时信息。但是,我不知道是否有一种方法可以使用 C++ 反射来测量对象的生命周期。此外,您能否认为 C++ 反射是一种减少分析类和分析类之间依赖关系的技术?
【问题讨论】:
-
我认为您可以将
ObjectInfo设为模板并直接从其继承:class A : public ObjectInfo<A>。 -
@BartekBanachewicz:这就是所谓的 CRTP,即奇怪重复的模板模式。
-
我知道我以前偶然发现过这个:P
-
奇怪的重复模板模式!这很好奇!谢谢
标签: c++ design-patterns rtti