2012-10-08 43 views
1

可能重複:
Why does my destructor appear to be called more often than the constructor?C++靜態計數器不增加正常

我有一個static sCounterint id有ID的訂購我的實例。

當在矢量將它們分組,這工作正常.. ID是corrrectly設置好的:

Task t("1st Task"); 
Task t2("2nd Task"); 
    Task t3("3rd Task"); 

std::vector<Task> myTasks; 
myTasks.push_back(t); 
myTasks.push_back(t2); 
myTasks.push_back(t3); 

任務數之一具有ID爲0,第二個:ID 1和第三一個ID 2. 然而如果我這樣做:

std::vector<Task> myTasks; 

myTasks.push_back(
    Task("First Task")); 
myTasks.push_back(
    Task("Second Task")); 
myTasks.push_back(
    Task("Third Task")); 

靜態SCOUNT值開始給奇怪的結果:

第一個獲得ID 1,第二個也ID 1,第三個獲得ID 0。

爲什麼用靜態計數器創建像這樣的對象?

的sCounter大幹快上的構造增加,並在析構函數減少:

int Task::sCount = 0; 

Task::Task(std::string text) { 
    this->setText(text); 
    this->setStatus(1); 
    time_t now = time(0); 
    timestamp = *localtime(&now); 
    std::cout << "Count from " << sCount; 
    sCount++; 
    std::cout << " to --> " << sCount << "\n"; 
    this->setID(); // set the current sCount to ID 
} 
Task::~Task() { 
    --sCount; 
} 

sCounter是一個私有靜態詮釋:static int sCount;

+1

你可以添加'Task'的代碼嗎? – Collin

+0

我想我們需要看到靜態計數器代碼以及如何調用這個代碼以在此處取得進展。 – Julian

+0

'sCounter'增加了多少?這裏沒有足夠的信息來回答這個問題。 – Justicle

回答

1

在第二種情況下,傳遞給push_back的每個Task實例都是一個臨時變量。這意味着一旦完成對push_back的調用,就會調用它的析構函數。析構函數然後在創建下一個任務之前遞減計數器。

myTasks.push_back(Task("First Task")); // Task's destructor is called before the next line 

雖然任務被複制到載體(因此數據存儲在存儲器中存在的其他地方),該標準::矢量隱式拷貝構造用來此不增加計數器。

+0

如果擺脫析構函數,它工作正常......但是這是正確的嗎? – jviotti

+1

這取決於你是否需要sCounter在程序結束時爲零。如果是這樣,如Michael建議你應該保留析構函數並實現一個*顯式拷貝構造函數*來增加計數器。如果任務只存在於一個容器(如向量)中,那麼您可能更好地跟蹤容器本身的ID,而不是使用構造函數/析構函數和靜態變量。 –

3

析構函數工作正常,但複製參與推動各地ISN東西構造不增加櫃檯。

只需實施顯式拷貝構造函數來照顧計數器。

+0

的構造函數/析構函數第二種方法是在創建下一個任務之前調用析構函數......但是,第二種方式似乎是動態創建任務的更好方法......什麼是最好的方法? – jviotti

+1

我不知道你的目標是什麼。 'id'聽起來像獨特的標識符和你似乎並沒有強制執行獨特性。也許你永遠不應該減少它。 –