2013-02-02 210 views
1

這似乎是不好的編碼習慣,但這是給我的指導方針。我想說,我不知道這將如何實際上在主要實施,我只是寫課程。C++ - 初始化成員函數內的成員變量?

class Example 
{ 
    private: 
    static int total; 
    public: 
    void initalizeTotal(); 
} 

Example::initalizeTotal() 
{ 
    total = 0; 
} 

總會(我猜)被用來計算該類的對象數。 這基本上是我所掌握的。問題是我如何弄清如何實際調用函數。 我不能只是在構造函數中調用它,感覺每次都會重置總數。 我試過了,如果變量有值,檢查失敗,如果沒有,請調用函數。

有沒有什麼建議誰能給?

編輯: 我忘了包括總的是靜態的。而且我必須有一個函數來初始化總數。這是分配的要求。

+0

希望這有助於:http://msdn.microsoft.com/en-us/library/b1b5y48f(v=vs.80).aspx – chris

回答

2

您可以total靜態變量:

class Example 
{ 
    private: 
    void addObject(); 
    public: 
    static int total; 
    Example(); 
} 

Example::Example() 
{ 
    addObject(); 
} 

void Example::addObject() 
{ 
    total++; 
} 

所以它不會屬於任何特定的對象。如果你在addObject()方法中增加它的值,將會在構造函數中調用它,你會得到對象的數量。

要訪問它,你將不使用任何Example對象,而是你可以使用這樣的:

std::cout << "Objects count:" << Example::total; 

如果你想要初始化它,你做你的代碼的某個地方同樣的方式:

Example::total = 0; 
+1

的名稱也應該改變,它不會初始化任何東西。 –

+0

現在,您在'initalizeTotal()'的定義中缺少返回類型。由於它不觸及任何實例的狀態,它也應該是'static'。你最好把它變成私人的,否則每個人和任何人都可能會混淆似乎是內部狀態的東西。 – Flexo

+1

此外,我意識到這是超越了問題的範圍,如果曾經被多個線程同時創建這些對象,這將打破。 –

5

由於total應爲每個對象相同的變量,你應該讓static

class Example { 
    private: 
     static int total; 
} 

要初始化靜態變量,你可以把這個線在一個.cpp文件:

int Example::total = 0; 

你並不需要調用任何功能,這樣做初始化。

+0

我知道這一點。這通常是我如何初始化變量。然而,這是一個我必須使用一個函數的任務。吮吸我知道-_- – user2036101

+0

它必須是一個成員函數嗎?你允許聲明該函數是靜態的嗎? –

2

您必須使用'total'字段作爲static變量才能與所有類型爲Example的對象共享。任何時候立即增加一個新的對象將增加total字段。 希望這有助於

1

嘗試以下操作:

#include <iostream> 

class Example { 
    static int total; 

    public: 
    Example() { total++; } 
    static int getTotal() { return total; } 
}; 

int Example::total = 0; 

int main() { 
    Example a, b, c, d; 

    std::cout << Example::getTotal(); // 4 
} 
+0

爲什麼getTotal()不是'static'? – Flexo

+0

@Flexo它應該是?爲什麼? – 0x499602D2

+1

它應該是因爲它不訪問非靜態狀態並且不需要這樣的訪問,因爲非變異成員應該是'const'。儘管如此,你仍然可以調用'a.getTotal()'(http://stackoverflow.com/a/325572/168175),就像在非const的實例上調用const成員一樣。 – Flexo