所以这是我的头文件:
#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/