链接 CPP 文件进行测试时出现 LNK2019 错误

LNK2019 error when linking CPP file for tests

我正在尝试编写一个对 3 次多项式执行运算的 Cubic class。当试图将 + 运算符重载到 return 一个新的 Cubic 对象时,它给了我一个 LNK2019 错误:

"unresolved external symbol "public: __thiscall Cubic::Cubic(void)" (??0Cubic@@QAE@XZ) 在函数 "public: class Cubic const __thiscall Cubic::operator+(class Cubic)" (? ?HCubic@@QAE?BV0@V0@@Z)"

我已经尝试查看我的函数声明是否与我的定义不同,但它们都是一样的。我认为问题出在重载运算符中,因为我尝试使用 rhs.coefficient[i] += coefficient[i] 和 returning rhs 修改每个系数并且效果很好。我想要 return 一个新的 Cubic 的原因是因为它看起来更正确,也因为它也更容易实现 - 运算符。

Cubic.h 文件

#include <iostream>

using namespace std;

    class Cubic
    {
    public:
        // Default constructor
        Cubic();
        // Predetermined constructor
        Cubic(int degree3, int degree2, int degree1, int degree0);

        // Return coefficient
        int getCoefficient(int degree) const;

        // Addition op
        const Cubic operator+(Cubic rhs);

        // Output operators
        friend ostream& operator<<(ostream& outStream, const Cubic& cubic);
    private:
        int coefficient[4];
    };

Cubic.cpp

#include "Cubic.h"
#include <iostream>

using namespace std;

Cubic::Cubic(int degree3, int degree2, int degree1, int degree0)
{
    coefficient[3] = degree3;
    coefficient[2] = degree2;
    coefficient[1] = degree1;
    coefficient[0] = degree0;
}

int Cubic::getCoefficient(int degree) const
{
    return coefficient[degree];
}

const Cubic Cubic::operator+(Cubic rhs)
{
    Cubic result;

    for (int i = 3; i >= 0; i--)
    {
        result.coefficient[i] = coefficient[i] + rhs.coefficient[i];
    }

    return result;
}

ostream& operator<<(ostream& outStream, const Cubic& cubic) {
    outStream << showpos << cubic.getCoefficient(3) << "x^(3)"
        << cubic.getCoefficient(2) << "x^(2)"
        << cubic.getCoefficient(1) << "x"
        << cubic.getCoefficient(0);

    return outStream;
}

Test.cpp

#include "Cubic.h"
#include <iostream>

using namespace std;

int main()
{
    Cubic lhs(3, 1, -4, -1);
    Cubic rhs(-1, 7, -2, 3);

    /* TESTS */
    cout << "Addition using + operator" << endl;
    cout << lhs + rhs << endl;

    return 0;
}

预期结果应该是+2x^(3)+8x^(2)-6x+2

您的问题是您声明了您的Cubicclass的默认构造函数,这里:

// Default constructor
Cubic();

但是您从来没有定义那个构造函数(至少,没有在您显示的任何代码中)。

您需要定义默认构造函数内联,如下所示:

// Default constructor
Cubic() { } // This provides a definition, but it doesn't DO anything.

或在别处提供单独的定义:

Cubic::Cubic()
{
    // Do something here...
}

您还可以将 "Do something" 代码添加到 内联 定义中!如果定义很小(一两行),大多数编码人员会这样做,但对于更复杂的代码,将定义分开。

编辑:或者,正如@Scheff 在评论中指出的那样,您可以使用以下方式显式定义默认构造函数:

// Default constructor
Cubic() = default; // Will do minimal required construction code.