Dev-c++中将头文件和头文件函数分离,编译主函数跳出undefined reference to 的问题解决

简介: Dev-c++中将头文件和头文件函数分离,编译主函数跳出undefined reference to 的问题解决


在学习谭浩强c++第三版面向对象编程,第二章习题四中:

需要实现三个文件分离,主函数(.cpp),类的声明(头文件),对成员函数定义文件(.cpp)

单在使用Dev-C++实现中,发现在编译一直出现undefined reference to set_value,也就是提示我们定义的这个函数未定义,但是我们定义了,所以应该是我们没有无法链接到函数实现文件。

解决方法一:使用visual studio 2022 编译器进行编译

源代码:

类的声明:

#include<iostream>
#include<string.h>
#include<string>
using namespace std;
//Student.h
class Student
{
private:
  int num;
  string name;
  char sex;
public:
  void set_value();
  void show_value();
};

成员函数定义

#include<iostream>
#include"类.h"
using namespace std;
void Student::set_value()
{
  cin >> num >> name >> sex;
}
//先编译此文件 
void Student::show_value()
{
  cout << "num:" << num << "name:" << name << "sex:" << sex;
}

主函数:(特别解释:主函数第一段的#define 是为了使用printf和scanf(visual stdio 2022 认为其不安全不能使用,需要引入这个宏定义))

#define _CRT_SECURE_NO_WARNINGS
#include<iostream> 
#include"类.h"
using namespace std;
int main()
{
  Student s1, s2;
  s1.set_value();
  s2.set_value();
  s1.show_value();
  s2.show_value();
  return 0;
}

问题解决:

图片.png

C、C++常用头文件及函数汇总

图片.png

下载

解决方法二:

因为在dev-c++中,系统是一个文件一个文件查找,就是说如果你要用这个类,或者这个函数,你都需要引入定义该函数实现的文件或声明该类的文件,比如我们在使用cout,cin函数进行提取插入流进行输入输出时一样,需要进行预处理指令#include<iostream>引入输入输出流函数。

所以在dev-c++应该依次引入文件。代码如下:

1、成员函数定义文件    define.cpp  

#include<iostream>
#include"class.h"
using namespace std;
void Student::set_value()
{
  cin >> num >> name >> sex;
}
//先编译此文件 
void Student::show_value()
{
  cout << "num: " << num << "name: " << name << "sex: " << sex<<endl;
}

2、类声明文件  class.h

#include<iostream>
#include<string>
using namespace std;
class Student
{
private:
  int num;
  string name;
  char sex;
public:
  void set_value();
  void show_value();
};

3、主函数文件  main.cpp (这里引入了.cpp , 而 Vscode 则是引入 class.h

#include"define.cpp" 
#include<iostream> 
using namespace std;
int main()
{
  Student s1, s2;
  s1.set_value();
  s2.set_value();
  s1.show_value();
  s2.show_value();
  return 0;
}

图片.png

我们来分析一下:

这里的主函数引入了define.cpp文件,相当于把define.cpp函数实现文件插入到main.cpp中,而在define.cpp文件中又引入类声明文件class.h,此时又相当于class.h函数又插入到main.cpp,所以综上相当于三个文件合在一起了。

总结:

在dev-c++中是一个一个文件查找,需要使用相应文件功能就需要引入。而在visual studio 2022 是创建文件是一个工程,在引入头文件中,如果在该头文件有函数声明,那么在使用该头文件中,vscode强大的链接功能会自动查找相应函数实现文件(只在当前目录下查找)。



相关文章
|
6月前
|
存储 算法 安全
c++模板进阶操作——非类型模板参数、模板的特化以及模板的分离编译
在 C++ 中,仿函数(Functor)是指重载了函数调用运算符()的对象。仿函数可以像普通函数一样被调用,但它们实际上是对象,可以携带状态并具有更多功能。与普通函数相比,仿函数具有更强的灵活性和可扩展性。仿函数通常通过定义一个包含operator()的类来实现。public:// 重载函数调用运算符Add add;// 创建 Add 类的对象// 使用仿函数return 0;
209 0
|
11月前
|
自然语言处理 编译器 C语言
为什么C/C++编译腰要先完成汇编
C/C++ 编译过程中先生成汇编语言是历史、技术和实践的共同选择。历史上,汇编语言作为成熟的中间表示方式,简化了工具链;技术上,分阶段编译更高效,汇编便于调试和移植;实践中,保留汇编阶段降低了复杂度,增强了可移植性和优化能力。即使在现代编译器中,汇编仍作为重要桥梁,帮助开发者更好地理解和优化代码。
为什么C/C++编译腰要先完成汇编
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
863 56
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
604 22
|
Linux 编译器 C语言
Linux c/c++之多文档编译
这篇文章介绍了在Linux操作系统下使用gcc编译器进行C/C++多文件编译的方法和步骤。
174 0
Linux c/c++之多文档编译
|
前端开发 小程序 JavaScript
微信小程序-Unhandled promise rejection TypeError: Cannot read property ‘get‘ of undefined
微信小程序-Unhandled promise rejection TypeError: Cannot read property ‘get‘ of undefined
|
存储 JavaScript 前端开发
成功解决:Cannot read properties of undefined (reading ‘commit‘)
这篇文章提供了解决Vuex中"Cannot read properties of undefined (reading 'commit')"错误的两种方法:检查模板中的数据属性是否存在,以及确保在Vue实例中正确挂载了store对象。
成功解决:Cannot read properties of undefined (reading ‘commit‘)
|
定位技术 Apache
Echarts——Invalid geoJson format Cannot read property 'length' of undefined
Echarts——Invalid geoJson format Cannot read property 'length' of undefined
248 0
|
JavaScript
VUE——filemanager-webpack-plugin报错TypeError: Cannot read property 'isFile' of undefined
VUE——filemanager-webpack-plugin报错TypeError: Cannot read property 'isFile' of undefined
352 0