C ++重新定义 - 头文件

时间:2013-04-22 09:49:54

标签: c++ include header-files redefinition

我是C ++的初学者,对你来说可能看起来很愚蠢,我无法理解。

Testapp.h

#ifndef TESTAPP_H
#define TESTAPP_H
using namespace std;
class Testapp {
private: 
public:
Testapp() { };   
};
#endif

的main.cpp

#include <cstdlib>
#include <iostream>
#include "Testapp.h"
Testapp::Testapp(){
}
int main(int argc, char *argv[])
{
system("PAUSE");
return EXIT_SUCCESS;
}

错误讯息:Redefinition of 'Testapp::Testapp()'

猜测它是两次定义构造函数,如何克服这个但我不确定。我正在使用DEV-C ++。

4 个答案:

答案 0 :(得分:4)

函数声明在给出函数的实现或主体时也是一个定义。您在类定义中有一个构造函数的定义,如下所示:

Testapp() { };  

它的身体是{ }并且是空的。然后,您的main.cpp文件中有另一个定义如下:

Testapp::Testapp(){
}

同样,这个函数定义有一个空体。仅仅因为函数实现完全相同,并不意味着它没关系。在一个定义规则下,您不能有多个函数定义。一个简单的解决方法是通过不提供正文来使类定义中的那个只是一个声明:

Testapp();

或者,你可以完全摆脱main.cpp中的定义。你到底做了什么取决于你想要如何布置你的代码。一种典型的方法是使用包含类定义和成员函数声明的头文件Testapp.h

#ifndef TESTAPP_H
#define TESTAPP_H
using namespace std;
class Testapp {
private: 
public:
Testapp(); // Just a declaration
};
#endif

然后在该类的实现文件Testapp.cpp中,给出成员函数定义:

#include "Testapp.h"

Testapp::Testapp() { }

然后在main.cpp中,只需包含头文件并使用它定义的类:

#include "Testapp.h"

int main(int argc, char *argv[])
{
  Testapp test;
  return 0;
}

我建议从头文件中删除using namespace std;。即使在用于污染全局命名空间的源文件中,它也被认为是非常糟糕的做法,但如果你在头文件中这样做,这将变得非常有感染力。

答案 1 :(得分:2)

在您的标头文件中,您只想编写函数“stub”或 function prototype

class Testapp {
  private: 
  public:
  Testapp();   
};

您需要在C ++中学习difference between function declarations (prototypes) and function definitions

答案 2 :(得分:1)

您已在班级声明中定义了Testapp::Testapp

Testapp() { };   

您需要删除

Testapp::Testapp(){
}

或者将构造函数定义更改为声明

Testapp();   

答案 3 :(得分:1)

它确实定义了两次 - 一次在Testapp.h中,一次在main.cpp中,只需删除其中一个。