c++重定义-头文件

C++ Redefinitions - Header files

本文关键字:文件 -头 定义 c++      更新时间:2023-10-16

我是一个完全的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()'

猜测它定义构造函数两次,如何克服这一点,虽然我不确定。

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

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;。即使在源文件中也被认为是非常糟糕的做法,因为这会污染全局命名空间,但如果在头文件中这样做,则会产生积极的影响。

在头文件中,你只想写一个函数"存根",或者函数原型:

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

你需要了解c++中函数声明(原型)和函数定义的区别。

您已经在类声明中定义了Testapp::Testapp

Testapp() { };   

你需要删除

Testapp::Testapp(){
}

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

Testapp();   

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