2014-01-22 23 views
-4

我想實現一個功能,我可以知道使用特定類創建了多少對象。計數從一個類創建的對象數量

我曾嘗試以下:

myClass.h

class myClass { 
private: 
    static int internalCounter; 
    int id; 
public: 
    myClass(): id(internalCounter) {internalCounter++;} 
} 

的問題是,C++不允許這樣,我不知道如何解決這個。 我已經看到了SA類似的問題在回答提示是這樣的:

myClass::internalCounter = 0; 

但我不認爲在語法層面這一權利。

+0

你是什麼意思「現在允許這個」? –

+0

@duffymo:它看起來像是每個對象的唯一標識符,而不是引用計數。 –

+0

爲什麼這麼多downvotes? –

回答

2

您需要在實現文件來定義靜態變量作爲

int myClass::internalCounter = 0; 

2

你看到的另一個建議幾乎是正確的。你需要的東西是這樣的:

int myClass::internalCounter = 0; 

但它需要在一個源文件(*的.cpp),而不是頭去。該行是必需的,因爲聲明本身(在頭文件中)永遠不會被實例化。將其解析爲源文件意味着它將在特定的翻譯單元中被拾取和實例化。

2

您必須定義靜態變量:

int myClass::internalCounter=0; 
在實現文件

,它總是最好看你的編譯器/連接器輸出,在克++而言,它是:

main.cpp:(.text.startup+0x2): undefined reference to `myClass::internalCounter' 

undefined reference手段它沒有被定義,這是暗示你必須在代碼中修復什麼

5

C++ 確實是允許這樣做。但是靜態變量需要一個定義,而且這聽起來像缺少了。你需要把這個源文件(而不是頭部)

int myClass::internalCounter = 0; 

= 0是可選的,因爲靜態變量是零初始化的默認,但您可能更要明確。

+0

謝謝!我會在幾分鐘內接受答案。 –

0

我會建議,因爲無論如何你需要將你的計數器放入一個源文件中,你可以將它的定義從類中拿出來放進匿名的命名空間區域。這將從您的頭文件中取出一些類的實現細節。

如果您在C++ 11中使用atomic_int而不是int

使用後增加操作符使操作正確原子化。

myClass。^ h

class myClass 
{ 
    private: 
    int id; 

    public: 
    myClass(); 
    // etc 
}; 

myClass.cpp

#include <atomic> 
#include "myClass.h" 

namespace { 
    static std::atomic_int internalCounter; 
} 

myClass::myClass() 
    : id(internalCounter++) 
{ 
} 

上atomic_int的operator++後遞增是,在顧名思義,原子,所以這將是線程安全的。

相關問題