2012-05-12 14 views
1

私はそれがとても馬鹿だと思っている間違いだと思いますが、私は何が間違っているのか分かりません。 私は静的および非静的変数といくつかのメソッドを持つクラスを公開しています。 私のプログラムでは、オブジェクトを作成し、このオブジェクトを参照によって一般的なメソッドに渡したいと思っています。メソッドを参照してオブジェクトを渡す

プログラムはコンパイルされず、コンパイラは本当に奇妙なエラーメッセージをスローします。アーキテクチャx86_64のため

未定義シンボル: "prueba :: NUM"、から を参照:ccbRZYqe.oにccbRZYqe.o でccbRZYqe.oで _main metodoC(pruebaの*)prueba :: prueba() prueba :: INICIO()ccbRZYqe.oで "prueba ::フラグ"、から参照: metodoC(prueba *)ccbRZYqe.o で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。重複したシンボルについて1つの文章を追加しました。もしあなたが '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;` 

を定義する必要があり、クラスの後にこれらを追加してから自分のdefinationを削除します。それはまた、適切な初期化子に追加し、[OK]を動作するはずですコンストラクタ内で

これは正常に動作します

+1

実際、彼らはクラスの中で宣言されている必要があります。 – juanchopanza

関連する問題