我的运算符重载没有返回我的int main吗?

时间:2019-12-19 01:57:44

标签: c++

我正在尝试编写一个添加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);
}

1 个答案:

答案 0 :(得分:0)

$在C ++中不是运算符。它只是一个没有任何特定含义的字符。源代码中是否将其支持为物理字符是实现定义的,是否将其解析为标识符的一部分也是实现定义的。如果将其解析为标识符的一部分,则它将成为令牌的一部分,就像字符az一样。

显然,您的编译器支持$作为源文件字符和标识符中的字符,因此您没有使运算符超载,您正在定义名称为operator$的普通成员函数,并且正在引用$num1中尚未事先声明的标识符main

您不能发明新的运算符。