5

Web サイトに変更が加えられたときにフラグを立てるコードに取り組んでいます。クラスで静的変数を使用して問題が発生したため、名前空間で変数を宣言し、変更が行われたときにこれを ==1 に設定したいと考えています。

問題を表すために私が書いた単純化されたコードを次に示します。

ph:

#include<iostream>
using namespace std;

#ifndef p_H
#define p_H
namespace testing{

 extern int changes_made;

 class p 
 {
   public: 
     void changed();
     void print_change();
     void print_change_ns();
   private:
     static int changes;
     int info;
};

}
#endif

p.cpp:

 #include "p.h"
#include<iostream>

using namespace testing;

int p::changes=0;

void p::changed(){
    p::changes=1;
    }

void p::print_change(){
    cout << p::changes << endl;
    }

void p::print_change_ns(){
    if (testing::changes_made == 1){
    cout << 1 << endl;
    }
    else{
    cout << 0 << endl;
    }
    }

main.cpp:

#include<iostream>
#include"p.h"

using namespace std;
using namespace testing;


int main(){

p test1, test2, test3;
test3.changed();
changes_made=1;

cout << "test1 ";
test1.print_change();
test1.print_change_ns();

cout << "test2 ";
test2.print_change();
test2.print_change_ns();

cout << "test3 ";
test3.print_change();
test3.print_change_ns();

p test4;
cout << "test4 ";
test4.print_change();
test4.print_change_ns();
return 0;
}

次のエラー メッセージが表示されます。

p.o: In function `testing::p::print_change_ns()':
p.cpp:(.text+0x45): undefined reference to `testing::changes_made'
main.o: In function `main':
main.cpp:(.text+0x9b): undefined reference to `testing::changes_made'
collect2: ld returned 1 exit status

これに関するヘルプは大歓迎です。以前に複数の宣言エラーがあったため、#ifndef のものと、変数の前に extern を導入しました。

4

2 に答える 2

9

externのような変数extern int changes_made;は、ストレージをどこかに作成する必要があります。あなたが述べたことは、「リンクの段階で、誰かがあなたにint型のこの名前のシンボルをエクスポートすることに気付くでしょう」です。

次に、ユニットがエクスポートされないため、約束を実行できませんでしたint testing::changes_made

上記のp.cppおよびmain.cpp(おそらくp.cpp)とリンクしているいくつかの.cppファイルで、次のような変数のインスタンスを作成します。

namespace testing {
  int changes_made = 0;
}

リンカのエラーはなくなるはずです。

于 2012-12-17T16:03:51.920 に答える
3

ヘッダーファイルで宣言 しました。testing::changes_madeしかし、あなたはそれを定義していません。また、正確に1つのソースファイル(おそらくp.cpp)に定義が必要です。

int testing::changes_made; // no "extern"
于 2012-12-17T16:04:38.680 に答える