2013-10-09 33 views
0

我在努力理解術語靜態方法及其工作方式。這裏我初始化了一個靜態變量「float percentage」。我必須把它轉換爲使用convertToPercent()百分比並將其轉換後,我也要把值,並把價值的someMethod()做一些計算無法理解術語「靜態」

下面

是我

.H

class Foo  { 

private: 
    static float percentage; 

public :  
    float convertToPercent(); 

}; 

的.cpp

float Foo::convertToPercent() { 
      percentage = (30/100) * 100; 
      return percentage; 
} 

static float someMethod() { 
    //place the static percentage value here after doing convertToPercent() method to do some calculation; 
} 

但它引發我一個錯誤消息

Undefined symbols for architecture x86_64: 
"Foo::percentage", referenced from: 
Foo::convertToPercent() in Foo.o 

給予幫助的頂點。謝謝

+3

你需要的地方很多來定義它,看到有關未定義符號靜在這裏... – PlasmaHH

+1

'static'關鍵字有很多不同的含義的其他問題的極大數,所以要小心 –

+0

好了感謝。設法已經在Visual Studio中使用Foo.o – user3493435

回答

2

一個靜態成員在該類的所有對象之間共享。

靜態數據成員在類聲明中聲明並在包含類方法的文件中初始化。範圍操作符用於初始化以指示靜態成員屬於哪個類。但是,如果靜態成員是一個const整型或枚舉類型,它可以在類聲明中初始化。

class Foo  { 
private: 
    static float percentage; // this is declaration not definition 

public :  
    float convertToPercent(); 

}; 

您需要在CPP文件中定義percentage

float Foo::percentage(0.0); // initialize percentage to 0.0  

§9.4.2 靜態數據成員

在靜態數據成員的聲明其類定義不是定義並且可能是不完整的類型符合cv標準的無效。

+1

好吧,非常感謝。設法讓它工作已經 – user3493435

+0

@jeremykeh很高興它幫助! – billz

1

你只宣佈它的類,但沒有給出在CPP的定義應該是這樣的認爲:

float Foo::percentage; 
+0

好吧,非常感謝。設法讓它工作已經 – user3493435

2

你必須定義在類以外的靜態變量。

// header file 
class Foo  { 
private: 
    static float percentage; 
}; 

// cpp file 
float Foo::percentage(0.0); 

因爲成員變量是靜態的,將僅存在該變量在整個過程的運行時的Foo類(所有的Foo對象)的所有實例之間共享的一個值。例如。如果有三個Foo對象A,B和C,則更改對象B中的百分比值也會在對象A和C中更改它。

+0

好的非常感謝。設法讓它工作已經 – user3493435

4

static在此上下文中表示變量percentage不屬於Foo類的特定實例,而是在所有Foo實例之間共享。

爲了讓鏈接器知道你需要定義它的變量,而不僅僅是聲明它,這就是爲什麼你會得到一個錯誤。

float Foo::percentage = 0; 

在.cpp文件

+1

好吧,非常感謝。設法讓它工作已經 – user3493435

0

下面你的代碼試圖聲明靜態成員變量百分比---奧凱

// header file 
class Foo  
{ 
    private: 
     static float percentage;  //constant declaration 
}; 

下面你的代碼試圖將值分配給尚未定義的對象(百分比)。 - 不行

// cpp file 
float Foo::convertToPercent() { 
     percentage = (30/100) * 100;  //tring to update percentage which is not defined yet. 
     return percentage;     //usage of object (percentage) which is not defined yet. 
} 

C++要求你任何你使用但具體類的常量是staic和整型是一個例外,提供了一個定義。只要你不接受他們的地址,你可以聲明它們並使用它們而不提供定義。

在你的情況下,你的實現文件(.cpp)應該有下面的行,然後你可以在適用的地方使用你的「百分比」常數。

float Foo::percentage(0.0);  //definition of static class member : percentage 
+0

感謝您的help.manage解決它,並瞭解什麼是靜態與每個人的幫助在這裏和你 – user3493435