我正在尝试编写一个添加2个八进制数字的代码,然后使用运算符重载将总和转换为十进制。但是,每当尝试使用convert操作符($)时,都会得到“在此作用域中未声明$ num1”。有人可以帮我吗?
注意:我知道有些事情可以简化,但是必须采用这种方式,因为这是我的老师想要的方式。我的主要问题是在主叫操作员。谢谢!
#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);
}
答案 0 :(得分:0)
$
在C ++中不是运算符。它只是一个没有任何特定含义的字符。源代码中是否将其支持为物理字符是实现定义的,是否将其解析为标识符的一部分也是实现定义的。如果将其解析为标识符的一部分,则它将成为令牌的一部分,就像字符a
至z
一样。
显然,您的编译器支持$
作为源文件字符和标识符中的字符,因此您没有使运算符超载,您正在定义名称为operator$
的普通成员函数,并且正在引用$num1
中尚未事先声明的标识符main
。
您不能发明新的运算符。