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



相关文章
|
3月前
|
存储 算法 安全
c++模板进阶操作——非类型模板参数、模板的特化以及模板的分离编译
在 C++ 中,仿函数(Functor)是指重载了函数调用运算符()的对象。仿函数可以像普通函数一样被调用,但它们实际上是对象,可以携带状态并具有更多功能。与普通函数相比,仿函数具有更强的灵活性和可扩展性。仿函数通常通过定义一个包含operator()的类来实现。public:// 重载函数调用运算符Add add;// 创建 Add 类的对象// 使用仿函数return 0;
121 0
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
88 0
|
8月前
|
自然语言处理 编译器 C语言
为什么C/C++编译腰要先完成汇编
C/C++ 编译过程中先生成汇编语言是历史、技术和实践的共同选择。历史上,汇编语言作为成熟的中间表示方式,简化了工具链;技术上,分阶段编译更高效,汇编便于调试和移植;实践中,保留汇编阶段降低了复杂度,增强了可移植性和优化能力。即使在现代编译器中,汇编仍作为重要桥梁,帮助开发者更好地理解和优化代码。
123 25
为什么C/C++编译腰要先完成汇编
|
6月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
339 6
|
10月前
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
751 56
|
10月前
|
自然语言处理 编译器 Linux
|
11月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
11月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
433 6
|
11月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
175 0
C++ 多线程之线程管理函数
|
存储 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‘)