1

私がやっている間違いはとてもばかげていると思いますが、何が間違っているのかわかりません。静的および非静的変数といくつかのメソッドを持つクラスがあり、すべてパブリックです。私のプログラムでは、オブジェクトを作成し、このオブジェクトを参照によって一般的なメソッドに渡したいと考えています。

プログラムはコンパイルされず、コンパイラは非常に奇妙なエラー メッセージをスローします。

アーキテクチャ x86_64 の未定義シンボル: "prueba::num"、参照元: ccbRZYqe.o 内の _main ccbRZYqe.o 内の metodoC(prueba*) ccbRZYqe.o 内の prueba::prueba() ccbRZYqe.o 内の prueba::inicio() "prueba::flag"、参照元: ccbRZYqe.o の metodoC(prueba*) ccbRZYqe.o の prueba::prueba() ccbRZYqe.o ld の prueba::inicio(): アーキテクチャ 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;
}
4

3 に答える 3

5

静的メンバーを定義する必要があります。それらは宣言されるだけです。

class prueba {
  // as before
};

および実装ファイルで:

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

各翻訳単位の静的な定義を取得するため、定義をヘッダーに配置しないでください。それらを実装ファイルに入れる必要があります。このファイルは、クライアントがビルドできる単一のオブジェクト ファイルを作成するために使用されます。

ただし、新しいオブジェクトをインスタンス化するたびpruebaに、コンストラクターの静的メンバーをリセットすることに注意してください。

于 2012-05-12T19:10:47.853 に答える
1

クラス内の静的メンバーはクラス内で宣言する必要がありますが、クラス外で定義する必要があります

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

これらをクラスの後に追加し、コンストラクター内からそれらの定義を削除します。

それはあなたのためにうまくいくでしょう

于 2012-05-12T19:16:23.200 に答える
0

エラーは、プルエバの num 値が static として宣言されているためだと思います。したがって、test.num によるアクセスは機能しません。これが値が未定義である理由です。

これを prueba::num += 2; に変更すると、問題なく動作するはずです。また、適切な初期化子を追加します。

bool prueba::flag = false;
int prueba::num = 0;
于 2012-05-12T19:13:06.013 に答える