对C++中类的未定义引用

Undefined reference to a class in C++

本文关键字:未定义 引用 C++      更新时间:2023-10-16

我有一个代码::blocks项目,名为Test.cbp。它有三个文件,main.cppTest目录中,jAlg.cppjAlg.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::jMatrixjVector::jVector都会出现错误。出于某种原因,该函数的存在使得可以定义向量,但不能定义矩阵。

所以我的问题是:为什么函数jVector operator* (jMatrix A, jVector v)的存在可以定义jVectors?我可以做些什么来定义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);的定义是可以的。