怎麼算在C++
回答
什麼對象的數量?如果要計算特定類的對象數量,可以使用靜態計數器。類似下面..上創造和毀滅的同時遞減計數器加..
class A
{
public:
static int counter;
A()
{
counter ++;
}
virtual ~A()
{
counter --;
}
};
int A :: counter = 0;
如果使用malloc創建對象,如何跟蹤它? – 2013-04-14 18:04:56
@KranthiKumar它*不是由'malloc()'創建的*'。'它被*分配*靜態地,或'新',或在堆棧上;它是由其構造函數之一*構造的;它被析構函數銷燬。 – EJP 2015-03-11 09:03:58
您可以創建一個計數器變量進入公衆:你的類(這裏假設你正在談論你創建了一個類的對象計數)
class Widget {
public:
Widget() { ++count; }
Widget(const Widget&) { ++count; }
~Widget() { --count; }
static size_t howMany()
{ return count; }
private:
static size_t count;
};
// obligatory definition of count. This
// goes in an implementation file
size_t Widget::count = 0;
你應該閱讀scott meyers的整篇文章,看看這個解決方案不是最好的。在文章結尾處,他描述了其他帖子中提到的模板方法。 – 2009-12-18 09:49:32
採取靜態計數器創建模板類。
然後,應用程序中的每個對象都會擴展此模板類。
當構造函數被稱爲增量靜態計數(靜態變量是每個類 - 由該類的所有對象共享)。
例如看到使用Curiously recurring template pattern對象計數器:
template <typename T>
struct counter
{
counter()
{
objects_created++;
objects_alive++;
}
virtual ~counter()
{
--objects_alive;
}
static int objects_created;
static int objects_alive;
};
template <typename T> int counter<T>::objects_created(0);
template <typename T> int counter<T>::objects_alive(0);
class X : counter<X>
{
// ...
};
class Y : counter<Y>
{
// ...
};
用法爲了完整性:
int main()
{
X x1;
{
X x2;
X x3;
X x4;
X x5;
Y y1;
Y y2;
} // objects gone
Y y3;
cout << "created: "
<< " X:" << counter<X>::object_created
<< " Y:" << counter<Y>::object_created
<< endl;
cout << "alive: "
<< " X:" << counter<X>::object_alive
<< " Y:" << counter<Y>::object_alive
<< endl;
}
輸出:
created: X:5 Y:3
alive: X:1 Y:1
template <class T>
class Counter
{
private:
static int count;
public:
Counter()
{
count++;
}
Counter(const Counter &c)
{
count++;
}
~Counter()
{
count--;
}
static int GetCount() {
return count;
}
}
template<class T>
int Counter<T>::count = 0;
class MyClass : private Counter<MyClass>
{
public:
using Counter<MyClass>::GetCount;
}
該技術被稱爲CRTP
@stefanB,這是正確的方法。你需要在Counter中有複製構造函數。 – Jagannath 2009-12-18 08:35:25
+1,stefanB的方法不處理'X x2; X x3 = x2;'。但是你不能像這樣初始化計數,因爲它不是常量。 – KeatsPeeks 2009-12-30 18:52:27
你是否正確...我想定義它outsied類。 – Ashish 2010-12-07 21:34:51
您必須重載新的和刪除運算符 來計算內存分配。
void * operator new (size_t size)
{
void * p = malloc (size);
num_allocations++;
return p;
}
void operator delete (void * p)
{
num_deletions++;
free (p);
}
如果你想跟蹤堆上的對象,我認爲new []和delete []也必須被重載。 – Ashish 2009-12-18 08:11:41
是的,你是正確的Mac。我只是想讓他開始。你需要重載你正在使用的新的每一個變體。 – DevDevDev 2009-12-19 00:25:34
不會破壞代碼?刪除應該先調用析構函數; – NoSenseEtAl 2011-09-14 12:22:20
- 1. yiiframe怎麼算
- 2. 怎麼算表
- 3. SQL怎麼算
- 4. C#計算器exponet函數。怎麼樣?
- 5. 怎麼算在線用戶
- 6. 怎麼算協會
- 7. 怎麼算網頁
- 8. 我怎麼能算多少元素在ICollection的在C#
- 9. 我怎麼能按在C#
- 10. 我怎麼能在C#
- 11. 你怎麼能在C
- 12. 我怎麼能寫在C#
- 13. 你怎麼退出在C++
- 14. 我怎麼可以在C
- 15. 我怎麼能圓時間,在C#.NET計算時間,雙時
- 16. 怎麼算通過SqlDataSource的
- 17. BMI計算器。怎麼了?
- 18. MYSQL QUERY算了,怎麼樣?
- 19. 蟒蛇怎麼算的HTML
- 20. 怎麼算連續編號
- 21. PHP我怎麼算細胞
- 22. 怎麼算所選文件
- 23. Java。算術運算。怎麼樣?
- 24. 怎麼算與一個子()在MySQL
- 25. C#怎麼了font.DrawText
- 26. 我怎麼用C#
- 27. 怎麼算的字符數,而忽略空間用C
- 28. 怎麼做算術運算DCG在序言
- 29. 我該怎麼辦用C
- 30. 怎麼辦httpPost使用C#
你只計算使用動態分配創建的對象還是具有自動存儲的對象(如堆棧)? – 2009-12-18 18:05:24