C++ 中对 Class::Function() 的未定义引用
本文简要讨论了 C++ 编程中最常见且同样严重的错误之一(即未定义对 Class::Function()
的引用)。
首先,我们将简要讨论在 C++ 中编码时的不同错误。然后,我们将解释未定义引用错误的原因和解决方法。
C++ 中的错误类型
与任何其他编程语言一样,由于多种原因,C++ 代码可能会出现错误或错误。这些错误大致分为以下错误类别:
-
语法错误
是由于违反 C++ 规则或任何语法而发生的错误。 -
运行时错误
是在语法上没有编程问题但在执行时检测到并导致程序崩溃时发生的错误。 -
当我们没有得到我们想要的结果或输出时,就会发生
逻辑错误
,这意味着我们的程序逻辑中存在错误。 -
链接器错误
是程序成功编译并尝试将其他一些对象与我们的主对象文件链接时的错误类型,因此不会生成可执行文件。例如,定义的函数的任何错误原型、包含的任何不正确的头文件等。
C++ 中对 Class::Function()
的未定义引用
这是 C++ 中最常发生的错误,并且同样重要,尤其是对于新程序员而言。这种类型的链接器错误会影响程序的运行。
这些错误主要发生在程序编译成功并且处于链接阶段试图将其他目标文件与主目标链接时。在某些情况下,程序会给出一些输出,并且会发生此错误。
因此,追踪和纠正此类错误有时会很复杂。
当我们使用了对某个类、函数或变量的任何引用时,就会发生未定义的引用错误。链接器无法在所有链接的目标文件和库中找到它的定义,从而产生错误 Undefined Reference to a Class::Function()
。
这些错误可能有多种原因,但我们将在这里讨论其中的一些。
由于 C++ 中没有函数定义,解决对 Class::Function()
的未定义引用
这可能是导致此错误的最直接原因,因为你提供了函数的原型但忘记给出其定义。
当你为该函数创建引用时,链接器将无法找到其定义,从而生成错误 Undefined Reference to a Class::Function()
。
这在下面的示例中得到了证明:
#include <iostream>
class Square {
public:
double length; // Length of a box
double width; // Breadth of a box
double height; // Height of a box
double getArea(void);
};
int main()
{
Square sq1;
sq1.getArea();
return 0;
}
输出:
(.text+0x15): undefined reference to Square::getArea()
collect2.exe: error: ld returned 1 exit status
由于 C++ 中没有链接的对象文件,解决对 Class::Function()
的未定义引用
当使用不同的文件来定义一个类时,我们需要将该文件包含在主函数文件中,以便在链接程序时与主对象文件链接。
在下面的示例中,我们在另一个文件中单独定义了 Square
类。在主文件中,我们引用了它的对象,所以它会给出一个未定义的引用错误,因为文件没有链接。
例子:
#include <iostream>
using namespace std;
int main()
{
Square sq1;
cout<<sq1.getArea();
return 0;
}
示例(Square.cpp
):
class Square {
public:
double length; // Length of a box
double width; // Breadth of a box
double height; // Height of a box
double getArea(void){
return length*width;
}
void setLength(double l){
length = l;
}
};
解决这个问题的方法是将 Square.cpp
文件链接到以下代码中的主文件。
#include <iostream>
#include "square.cpp"
using namespace std;
int main()
{
Square sq1;
cout<<sq1.getArea();
return 0;
}
由于未在 C++ 中编译相关文件,解决对 Class::Function()
的未定义引用
当程序的所有依赖项都没有成功编译时,也会出现这种类型的错误。为了使链接器成功生成可执行文件,有必要在启动链接阶段之前编译所有依赖项。
这是不可避免的,因此链接器可以轻松找到所有相关的目标文件(即 .o
文件)。如果任何依赖对象文件丢失,链接器将生成未定义引用
错误。
除了上面讨论的情况之外,未定义的参考错误可能还有许多其他情况。程序员必须正确定义所有标识符(例如,函数、变量和对象)以避免此类问题。
相关文章
在 C++ 中通过掷骰子生成随机值
发布时间:2023/04/09 浏览次数:169 分类:C++
-
本文解释了如何使用时间因子方法和模拟 C++ 中的掷骰子的任意数方法生成随机数。了解它是如何工作的以及它包含哪些缺点。提供了一个 C++ 程序来演示伪数生成器。
在 C++ 中使用模板的链表
发布时间:2023/04/09 浏览次数:158 分类:C++
-
本文解释了使用模板在 C++ 中创建链表所涉及的各个步骤。工作程序演示了一个链表,该链表使用模板来避免在创建新变量时声明数据类型的需要。
在 C++ 中添加定时延迟
发布时间:2023/04/09 浏览次数:142 分类:C++
-
本教程将为你提供有关在 C++ 程序中添加定时延迟的简要指南。这可以使用 C++ 库为我们提供的一些函数以多种方式完成。
在 C++ 中创建查找表
发布时间:2023/04/09 浏览次数:155 分类:C++
-
本文重点介绍如何创建查找表及其在不同场景中的用途。提供了三个代码示例以使理解更容易,并附有代码片段以详细了解代码。
如何在 C++ 中把字符串转换为小写
发布时间:2023/04/09 浏览次数:63 分类:C++
-
介绍了如何将 C++ std::string 转换为小写的方法。当我们在考虑 C++ 中的字符串转换方法时,首先要问自己的是我的输入字符串有什么样的编码
如何在 C++ 中确定一个字符串是否是数字
发布时间:2023/04/09 浏览次数:163 分类:C++
-
本文介绍了如何检查给定的 C++ 字符串是否是数字。在我们深入研究之前,需要注意的是,以下方法只与单字节字符串和十进制整数兼容。
如何在 c++ 中查找字符串中的子字符串
发布时间:2023/04/09 浏览次数:65 分类:C++
-
本文介绍了在 C++ 中检查一个字符串是否包含子字符串的多种方法。使用 find 方法在 C++ 中查找字符串中的子字符串
如何在 C++ 中把字符串转换为 Char 数组
发布时间:2023/04/09 浏览次数:107 分类:C++
-
本文介绍了在 C++ 中把字符串转换为 char 数组的多种方法。使用 std::basic_string::c_str 方法将字符串转换为 char 数组