c++重定义-头文件
C++ Redefinitions - Header files
我是一个完全的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中,只需删除其中一个。
相关文章:
- c++库的公共头文件中应该包含什么
- 用C++在单独的头文件中完成函数体
- 头文件-继承c++
- 头文件、宏和内联函数c++
- 使用mongocxx驱动程序时包含头文件问题
- C++无法定义虚拟函数 OUTER 类和头文件
- 为什么您需要C++头文件的包含保护
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 如何将二进制文件头示例代码 (C++/C#) 转换为 Python?
- extern 关键字在包含文件头文件C++
- 如何在不同的文件头上添加类朋友
- 如何使用gcc/g++编译多个cpp文件头文件
- 如何在 c++ 中读取文件头
- C/C++ 中的跨平台自定义文件头
- 使用fread()读取BMP的文件头
- C++模块定义文件头内联符号
- 在MFC中序列化为Unicode文本文件-文件头错误
- 读取PPM文件头(类型P6),宽度缺失
- 如何将主文件分成三个文件:头文件、客户端和实现
- 生成包含头文件的文件头文件