2012-05-12 92 views
1

我認爲我做錯了這個錯誤是如此愚蠢,但我不知道我做錯了什麼。 我有一個類與靜態和非靜態變量和一些方法,所有公共。 在我的程序中,我想創建一個對象,並通過引用將此對象傳遞給一個通用方法。通過引用的方法傳遞一個對象

該程序不編譯,編譯器會拋出真正奇怪的錯誤消息。對於架構x86_64的

未定義的符號: 「prueba :: NUM」,從引用 : _main中ccbRZYqe.o在ccbRZYqe.o prueba :: prueba()在ccbRZYqe.o metodoC(prueba *) prueba :: INICIO()在ccbRZYqe.o 「prueba ::標誌」,從引用:在ccbRZYqe.o metodoC(prueba *)prueba :: prueba()在ccbRZYqe.o prueba :: INICIO()在ccbRZYqe.o ld:找不到架構x86_64的符號collect2:ld返回1退出狀態

代碼

#include <iostream> 

using namespace std; 

class prueba 
{ 
    private: 
    public: 
     static bool flag; 
     static int num; 
     float complejo; 

     // Metodos 
     //-------------- 
     prueba() 
     { 
      flag = false; 
      num = 0; 
      complejo = 0.0; 
     } 

     void inicio() 
     { 
      flag = true; 
      num = 5; 
      complejo = 3.2; 
     } 

     bool cambio() 
     { 
      flag++; 
      num++; 
      complejo++; 
     } 
}; 

bool metodoC(prueba* ensayo) 
{ 
    cout << "-----------------------------------------" << endl; 
    cout << "- flag: " << ensayo->flag << endl; 
    cout << "- num: " << ensayo->num << endl; 
    cout << "- Complejo: " << ensayo->complejo << endl; 
    cout << "-----------------------------------------" << endl; 

    return true; 
} 

//----------------------------------- 
//  M A I N 
//----------------------------------- 
int main(int argc, char *argv[]) 
{ 
    prueba test; 

    test.inicio(); 

    test.num += 2; 
    test.complejo += 5.2; 

    metodoC(&test); 

    return 0; 
} 

回答

5

您需要定義靜態成員。他們只是宣佈。

class prueba { 
    // as before 
}; 

,並在實現文件

bool prueba::flag=false; 
int prueba::num=0; 

注意,你不應該把定義在一個頭,因爲你會得到靜力學每個翻譯單元的定義。你需要將它們放在一個實現文件中,然後用它來創建客戶端可以構建的單個對象文件。

但要小心,每次實例化一個新的prueba對象時,都會在構造函數中重置靜態成員。

+0

謝謝你的明確答案。/Gracias por tu respuesta。 –

+0

@JorgeVegaSánchezde nada。我添加了一個關於重複符號的句子,如果您有多個使用「prueba」類的翻譯單元,這可能很重要。 – juanchopanza

0

我認爲這個錯誤是因爲prueba中的num值被聲明爲靜態的,因此通過test.num來訪問它將不起作用,這就是爲什麼該值是未定義的。

如果將其更改爲prueba :: num + = 2;它應該工作正常,還可以添加在適當的初始化:

bool prueba::flag = false; 
int prueba::num = 0; 
+0

這兩種都是訪問成員的完美有效方式。 – chris

+0

@ CD1212這不是必需的,但提高了可理解性,即成員不屬於任何特定實例。問題是需要在翻譯單元中定義靜態成員。 – Mahesh

1

類的靜態成員應在類中聲明,但在類外定義

 `bool prueba::flag=false;` 
     int prueba::num=0;` 

下課後添加這些和刪除其認定中在構造函數中。

它會正常工作

+1

實際上,他們需要在課堂內部進行聲明(因爲它們是)和* defined * outside之外。 – juanchopanza