所以这是我的头文件:

#pragma once
#ifndef HYPERINT_H
#define HYPERINT_H
#include <iostream>
#include <vector>

class Hyperint
{
public:
Hyperint();
Hyperint(long a);
~Hyperint(void);


Hyperint & operator*= (const Hyperint & right);


std::vector<int> hyperintVector;

};

Hyperint operator* (const Hyperint & left, const Hyperint &right);

#endif


这是我的cpp文件:

#include "stdafx.h"
#include "Hyperint.h"
using namespace std;

Hyperint::Hyperint(long a)
{
//vector<int> hyperint;
int b = a;
while (b != 0){
    int h = b % 10;
    this->hyperintVector.push_back(h);
    b = b / 10;
}
}


Hyperint::~Hyperint()
{
}

Hyperint operator*(const Hyperint & left, const Hyperint & right){
vector<int> leftVec = left.hyperintVector;
vector<int> rightVec = right.hyperintVector;
vector<int> resultVector;
Hyperint result;

int carry = 0;
int counter1 = 0;
for (vector<int>::const_iterator it = leftVec.begin(); it != leftVec.end(); ++it){

    int counter2 = 0;
    int totalOperand = 0;
    for (vector<int>::const_iterator it2 = rightVec.begin(); it2 != rightVec.end(); ++it2){
        double pow2 = pow(10, counter2);
        totalOperand += ((*it2) * ((int) pow2)) * (*it);
        ++counter2;
    }
    totalOperand += carry;
    int store = totalOperand % 10;
    resultVector.push_back(store);
    carry = totalOperand / 10;
    ++counter1;
}
while (carry != 0){
    int putIn = carry % 10;
    resultVector.push_back(putIn);
    carry /= 10;
}
result.hyperintVector = resultVector;
return result;
}

Hyperint & Hyperint::operator*=(const Hyperint & right){
vector<int> rightVec = right.hyperintVector;
//vector<int> leftVec = this->hyperintVector;
vector<int> resultVector;
Hyperint theResult;
int carry = 0;
int counter1 = 0;

for (vector<int>::const_iterator it = (this->hyperintVector).begin(); it != (this->hyperintVector).end(); ++it){

    int counter2 = 0;
    int totalOperand = 0;
    for (vector<int>::const_iterator it2 = rightVec.begin(); it2 != rightVec.end(); ++it2){
        double pow2 = pow(10, counter2);
        totalOperand += ((*it2) *((int)pow2)) * (*it);
        ++counter2;
    }
    totalOperand += carry;
    int store = totalOperand % 10;
    resultVector.push_back(store);
    carry = totalOperand / 10;
    ++counter1;
}
while (carry != 0){
    int putIn = carry % 10;
    resultVector.push_back(putIn);
    carry = carry/10;
}
(this->hyperintVector) = resultVector;
return *this;
}


现在,当我编译它时,问题就出现了……我得到1条错误,但我不知道它是什么,它意味着什么,或者为什么以及如何解决它。


  错误1错误LNK2019:未解析的外部符号“公共:__thiscall Hyperint :: Hyperint(void)”(?? 0Hyperint @@ QAE @ XZ)在函数“公共:类Hyperint和__thiscall Hyperint :: operator * =((类Hyperint const)中引用” &)“(?? XHyperint @@ QAEAAV0 @ ABV0 @@ Z)C:\ Users \ Drock \ documents \ visual studio 2013 \ Projects \ A3-Attempt \ A3-Attempt \ Hyperint.obj A3-Attempt

最佳答案

这意味着链接器正在尝试查找Hyperint::Hyperint()的定义,但找不到它。您需要提供一个实现。

链接器错误可能会引起混淆,而且比编译器错误更严重,因为名称会乱码,并且您通常会在生成该错误的代码中丢失确切的位置。让我们看一下您的错误消息,因为它包含了您需要的所有信息,但呈现得很差。我会加粗重要部分。


  错误1错误LNK2019:未解析的外部符号“公共:__thiscall Hyperint :: Hyperint(void)”(?? 0Hyperint @@ QAE @ XZ)在函数“公共:类Hyperint和__thiscall Hyperint :: operator * =((类Hyperint const)中引用” &)“(?? XHyperint @@ QAEAAV0 @ ABV0 @@ Z)C:\ Users \ Drock \ documents \ visual studio 2013 \ Projects \ A3-Attempt \ A3-Attempt \ Hyperint.obj A3-Attempt


用人类的术语来说,Visual Studio抱怨它的链接器遇到一个名为LNK2019的错误,这是由于在通过函数Hyperint :: operator * =(时无法找到符号Hyperint :: Hyperint(void)而引起的类Hyperint const&)。

呼叫的第一个端口是错误号。这在搜索引擎中很容易找到,它在MSDN上提供了以下页面:http://msdn.microsoft.com/en-us/library/799kze2z.aspx

该页面描述了错误是什么,并提供了一些示例类型的代码来生成该错误。本子页面描述了更接近您的问题:http://msdn.microsoft.com/en-us/library/x3k07566.aspx

更具体地说,它找不到Hyperint::Hyperint()的实现。在C ++中,仅声明它(例如在标头中的Hyperint();中)是不够的,您通常需要在相应的cpp文件中某个地方实现(大括号{}中的代码)。

最后,就是说在处理Hyperint::operator*=(class Hyperint const &)函数时遇到了此错误。此信息对于跟踪此错误实际上没有用,但可能是由以下行引起的:

Hyperint result;


它创建一个Hyperint对象并使用无参数构造函数即Hyperint::Hyperint()进行初始化。

因此,将所有这些放在一起,就可以在标头中声明并使用无参数构造函数Hyperint::Hyperint()

class Hyperint
{
public:
Hyperint();    // < this line here
Hyperint(long a);
~Hyperint(void);
// ...
};


但是您尚未在cpp文件中实现它。您可能需要这样的东西:

Hyperint::Hyperint()
{
    // some code goes here, if required
}

关于c++ - C++重载运算符问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22314238/

10-11 03:50