2014-02-22 19 views
1

我需要你們在CRTP中的幫助(可能是基本問題,對不起)。 這是基於以下職位: C++ object lifetime profiling How to count the number of CRTP subclasses of a template class?C++:CRTP:如何知道所有對象的數量?

使用CRTP,我們能數爲每個類類型創建對象的數量。但是,使用這種方法我找不到在系統中創建的對象的總數。

有什麼辦法可以達到這個目的嗎?

在此先感謝。

問候, SNR

+1

請把問題自成體系。 –

+0

你是單程還是多線程程序? –

+0

@Mateusz Grzejek,我想爲單線​​程做到現在。但未來的需求可能是多線程的。正如你所說,這是爲了維護對象配置文件信息,並希望添加對象大小和任何其他對象相關的信息。 – SNR

回答

1

該解決方案包含(每級和全局)計數器的代碼。

extern size_t Global_counter; //In .cpp file define it: size_t Global_counter = 0; 

template <class T> 
class CountedClass 
{ 
protected: 
    static size_t this_class_counter; 

public: 
    static size_t GetThisClassCounter() 
    { 
    return this_class_counter; 
    } 

    static size_t GetGlobalCounter() 
    { 
    return Global_counter; 
    } 

    CountedClass() 
    { 
    ++this_class_counter; 
    ++Global_counter; 
    } 
}; 

template <class T> 
size_t CountedClass<T>::this_class_counter = 0; 

使用範例:

class A : public CountedClass<A> 
{ 
public: 
    A() : CountedClass<A>() 
    { 
    } 
}; 

class B : public CountedClass<B> 
{ 
public: 
    B() : CountedClass<B>() 
    { 
    } 
}; 

A a1; 
A a2; 
B b2; 

std::cout<<A::GetThisClassCounter(); //prints 2 
std::cout<<A::GetGlobalCounter(); //prints 3 

std::cout<<B::GetThisClassCounter(); //prints 1 
std::cout<<B::GetGlobalCounter(); //prints 3 
+0

+1好的解決方案!如果你將類GetGlobalCounter的getter分解出來(不應該太難),會更好。 –

+0

謝謝。如果想從類中移除GetGlobalCounter(),這可以毫無問題地完成 - 只需將其設置爲全局函數即可。但是,我將它放在那裏,出於某種原因 - 查看示例代碼,它看起來更直觀。您將全局計數器視爲每個類的一部分,而不是一個獨立的變量。但這是一個品味的問題,我認爲:) –

+0

可能是,爲這種情況引入某種類特質類訪問點可能會有用。 –

0

讓所有類都從一個共同的基類,它保持一個計數器,像

class Counter { 
    static int count = 0; 

protected: 
    Counter() { count++; } 

public: 
    int getCount() { return count; } 
}; 

繼承至於你要計算所有你並不需要的情況下,區分不同的派生類,所以你不需要CRTP。

如果你想要這兩個計數你可以使用一個類如上面的類作爲你的CRTP類的基類。

+0

在提供的示例中,每個類都已經從'Counted'類繼承,因此您的解決方案引入了多重繼承,這對於這樣簡單的任務來說不是必需的。由於它只是配置文件信息,因此應選擇非侵入式方法。 –

+0

我沒有建議使用多重繼承,讀得更好。像我的例子那樣,將類作爲類模板的基類,並不像使用全局變量那樣更具侵入性和更好的封裝性。如果你不想使用內存分析器侵入,而不是基類。 –

+0

@Nicola Musatti,非常感謝你的代碼。我正在尋找一個類,它可以說派生類對象的創建和銷燬類名(真的想用對象名)。所以qn來自第一個鏈接的對象分析。如果我想爲某個對象保存這些信息,我覺得CRTP很好。 Bcz,與CRTP我可以得到類名,並可以說什麼時候創建,銷燬和該類的大小。 – SNR

相關問題