5

我正在编写一些代码来标记网站何时发生更改。我在类中使用静态变量时遇到了问题,所以我想在命名空间中声明一个变量,并在进行更改时设置 this ==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;
    }
    }

主.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但你还没有定义它。您还需要在一个源文件中进行定义(可能p.cpp):

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