对C++中类的未定义引用
Undefined reference to a class in C++
我有一个代码::blocks项目,名为Test.cbp。它有三个文件,main.cpp
在Test
目录中,jAlg.cpp
和jAlg.h
都在jAlg
目录中。
main.cpp
#include <iostream>
#include "jAlg.h"
int main(){
jVector bob;
jMatrix ann;
bob.display();
return 0;
}
jAlg.cpp(摘要)
class jMatrix{
public:
//The four entries of a 2x2 square matrix:
//[a b]
//[c d]
double a, b, c, d;
//Constructor
jMatrix(double a_val = 1, double b_val = 0,
double c_val = 0, double d_val = 1){
a = a_val;
b = b_val;
c = c_val;
d = d_val;
}
//Several other functions and operator overloads
};
class jVector{
public:
//The two entries of a 2D vector
//[x]
//[y]
double x, y;
//Constructor
jVector(double x_val = 0,
double y_val = 0){
x = x_val;
y = y_val;
}
//Several other functions and operator overloads
};
//Several other functions
//Matrix-vector multiplication
jVector operator* (jMatrix A, jVector v){
jVector result;
result.x = A.a*v.x + A.b*v.y;
result.y = A.c*v.x + A.d*v.y;
return result;
}
//More functions
jAlg.h(摘要)
#ifndef JALG
#define JALG
double sqr(double x);
class jMatrix{
public:
double a, b, c, d;
jMatrix(double a_val = 1, double b_val = 0,
double c_val = 0, double d_val = 1);
//more functions
};
class jVector{
public:
double x, y;
jVector(double x_val = 0, double y_val = 0);
//more functions
};
jVector operator* (jMatrix A, jVector v);
#endif
当我构建和运行这个项目时,它的行为很奇怪。出现一个错误,称为undefined reference to 'jMatrix::jMatrix(double,double,double,double)'
。但是,不存在与jVector::jVector
构造函数相关的错误。
作为测试,我转到jAlg
文件,注释掉了jVector operator* (jMatrix A, jVector v)
函数,然后再次运行该项目。这一次,jMatrix::jMatrix
和jVector::jVector
都会出现错误。出于某种原因,该函数的存在使得可以定义向量,但不能定义矩阵。
所以我的问题是:为什么函数jVector operator* (jMatrix A, jVector v)
的存在可以定义jVector
s?我可以做些什么来定义jMatrix
对象?
在jAlg.cpp
文件中,您应该只定义您的函数,而不是再次声明所有
jMatrix::jMatrix(double a_val, double b_val, double c_val, double d_val)
: a{a_val}, b{b_val}, c{c_val}, d{d_val}
{ }
// ... define other jMatrix functions similarly
jVector::jVector(double x_val, double y_val)
: x{x_val}, y{y_val}
{ }
// ... define other jVector functions
//Several other functions
jVector operator* (jMatrix A, jVector v)
{
jVector result;
result.x = A.a*v.x + A.b*v.y;
result.y = A.c*v.x + A.d*v.y;
return result;
}
在jAlg.cpp
文件中,您不应该重新声明类,而应该为从jAlg.h
声明的函数定义(对其他类似的类成员函数这样做):
jMatrix::jMatrix(double a_val, double b_val,
// ^^^^^^^^^ Prefix class scope
double c_val, double d_val)
: a(a_val), b(b_val), c(c_val), d(d_val) {}
还要使用成员初始值设定项列表(如上所示)。
自由函数jVector operator* (jMatrix A, jVector v);
的定义是可以的。
相关文章:
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用