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强大的链接功能会自动查找相应函数实现文件(只在当前目录下查找)。



相关文章
|
2月前
|
自然语言处理 编译器 Linux
|
2月前
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
|
3月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
190 22
|
3月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
3月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
110 6
|
3月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
51 0
|
3月前
|
Linux 编译器 C语言
Linux c/c++之多文档编译
这篇文章介绍了在Linux操作系统下使用gcc编译器进行C/C++多文件编译的方法和步骤。
53 0
Linux c/c++之多文档编译
|
5月前
|
存储 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‘)
|
5月前
|
定位技术 Apache
Echarts——Invalid geoJson format Cannot read property 'length' of undefined
Echarts——Invalid geoJson format Cannot read property 'length' of undefined
117 0
|
5月前
|
JavaScript
VUE——filemanager-webpack-plugin报错TypeError: Cannot read property 'isFile' of undefined
VUE——filemanager-webpack-plugin报错TypeError: Cannot read property 'isFile' of undefined
104 0