我正在尝试编写一段代码,将2个八进制数相加,然后使用运算符重载将和转换为小数。然而,每当我尝试使用我的转换操作符($)时,我得到"$num1没有在这个作用域中声明“。有谁可以帮我?
注意:我知道为了简单起见,有些东西是可以改变的,但它必须这样做,因为这是我的老师想要的方式。我的主要问题是在main中调用运算符。谢谢!
#include <iostream>
#include <math.h>
#include <algorithm>//reverse
#include <vector>
using namespace std;
int gnum=0;
class Oct{
private:
int number;//Base 10
vector <int> octnum;//separated out number
public:
Oct();
void input();//input 457
void setNum(int);//sending setNum a base 10 number(457)
void operator+ (Oct);//if(sum>7)sum-8
int operator$ ();//converts sum to base 10
void display();
vector <int> octSum;//vector of added numbers
};
Oct::Oct()
{
number = 0;
octnum.push_back(0);
}
void Oct::input()
{
cout<<"Enter your number: ";
cin>>number;
gnum = number;
}
void Oct::setNum(int num)
{
while(num!=0)
{
octnum.push_back(num%10);
num=num/10;
}
octnum.push_back(0);
if(octnum[0]==0)
{
octnum.erase(octnum.begin());
}
}
void Oct::display()
{
for(int i = 0;i<octSum.size();i++)
{
cout<<octSum[i];
}
cout<<endl;
}
void Oct::operator+ (Oct num2)
{
int carry = 0;
int add = 0;
for(int i = 0;i<octnum.size();i++)
{
add = octnum[i]+num2.octnum[i]+carry;
if(add>7)
{
add=add-8;
carry = 1;
}
else
{
carry = 0;
}
octSum.push_back(add);
}
}
int Oct::operator$ ()
{
for(int i = 0;i<octSum.size();i++)
{
octSum[i]=octSum[i]*int(pow(8,i)+0.5);
}
reverse(octSum.begin(),octSum.end());
int sum = 0;
for(int i = 0;i<octSum.size();i++)
{
sum = sum + octSum[i]*int(pow(10,octSum.size()-1-i)+0.5);
}
return sum;
}
int main()
{
Oct num1,num2;
num1.input();
num1.setNum(gnum);
num2.input();
num2.setNum(gnum);
num1+num2;
int j = $num1;
num1.display();
return(0);
}发布于 2019-12-19 10:04:58
$不是C++中的运算符。它只是一个字符,没有任何特定的含义。在源代码中是否支持它作为物理字符是由实现定义的,它是否将被解析为标识符的一部分也是由实现定义的。如果它被解析为标识符的一部分,它将成为令牌的一部分,就像字符a到z一样。
显然,你的编译器支持$作为源文件字符和标识符中的字符,因此你没有重载操作符,你正在定义一个名为operator$的普通成员函数,并且你在main中引用了一个事先没有声明的标识符$num1。
你不能发明新的运算符。
https://stackoverflow.com/questions/59402369
复制相似问题