错误C2679:二进制' +' :找不到哪个操作符采用类型的右操作数

时间:2015-01-10 16:45:28

标签: c++ class operator-overloading

首先,是的,这是我正在努力的功课,所以请帮助。我们在C ++中制作一个计算器,它应该在+和 - 运算符上有不同的功能。 使用' +'它应该将两个数字加在一起(即45 + 54 = 4554)。 随着' - '它应该从第二个元素中删除第一个元素的第一个数字(即1217 - 1 = 27)我们应该通过重载+和 - 运算符来实现这一点,我似乎正在努力。在此先感谢您的帮助!

class WhackyRPN
{
public:
    int value;
    int operator+ (WhackyRPN a[]);
    int operator- (WhackyRPN s[]);
    int getValue();
    void setValue(int);
};

void WhackyRPN::setValue(int val){
    value = val;
}

int WhackyRPN::getValue(){
    return value;
}

int WhackyRPN::operator+ (WhackyRPN a[]){
    string combinedNum = to_string(a[1].getValue()) + to_string(a[0].getValue());
    int finalNum = stoi(combinedNum);
    return finalNum;
}

int WhackyRPN::operator- (WhackyRPN s[]){
    int minusNum;
    string firstNum = to_string(s[0].getValue());
    string secondNum = to_string(s[1].getValue());
    string minusString = to_string(minusNum);
    for (int i = 0; i < firstNum.length(); i++){
        if (firstNum.at(0) != secondNum.at(i)){
            minusString.at(i) += secondNum.at(i);
        }
    }
    minusNum = stoi(minusString);
    return minusNum;
}

int main()
{

    WhackyRPN stackPos[4];

    string indent = "     ";
    string userInput;
    stackPos[0].setValue(0);
    stackPos[1].setValue(0);
    stackPos[2].setValue(0);
    stackPos[3].setValue(0);

    while (1){
        system("cls");
        cout << "---STACK---" << endl;
        cout << indent << stackPos[3].getValue() << endl;
        cout << indent << stackPos[2].getValue() << endl;
        cout << indent << stackPos[1].getValue() << endl;
        cout << indent << stackPos[0].getValue() << endl;
        cout << "CMD: ";
        cin >> userInput;

        if (userInput == "exit" || userInput == "Exit" || userInput == "EXIT"){
            exit(0);
        }
        switch (userInput[0]){
        case 'q':
        case 'Q':
            exit(0);
        case 'p':
        case 'P':
            stackPos[0] = stackPos[1];
            stackPos[1] = stackPos[2];
            stackPos[2] = stackPos[3];
            break;
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
        case '0':
            stackPos[3].setValue(stackPos[2].getValue());
            stackPos[2].setValue(stackPos[1].getValue());
            stackPos[1].setValue(stackPos[0].getValue());
            stackPos[0].setValue(stoi(userInput));
            break;
        case '+': //combine pos[1] and pos[0];
            int finalNum = stackPos[1] + stackPos[0];
            stackPos[3].setValue(stackPos[2].getValue());
            stackPos[2].setValue(stackPos[1].getValue());
            stackPos[1].setValue(stackPos[0].getValue());
            stackPos[0].setValue(finalNum);
            break;
        case '-': //remove pos[0].firstNum from pos[1]
            int minusNum = stackPos[0] - stackPos[1];
            stackPos[3].setValue(stackPos[2].getValue());
            stackPos[2].setValue(stackPos[1].getValue());
            stackPos[1].setValue(stackPos[0].getValue());
            stackPos[0].setValue(minusNum);
            break;
        case '/': //divide pos[1] by pos[0]
            if (stackPos[0].getValue() == 0){
                cout << "Cannot divide by 0" << endl;
                system("pause");
                break;
            }
            int endQuotient = stackPos[1].getValue() / stackPos[0].getValue();
            stackPos[3].setValue(stackPos[2].getValue());
            stackPos[2].setValue(stackPos[1].getValue());
            stackPos[1].setValue(stackPos[0].getValue());
            stackPos[0].setValue(endQuotient);
            break;
        case '*':   //multiply pos[1] by pos[0]
            int endProduct = stackPos[1].getValue() * stackPos[0].getValue();
            stackPos[3].setValue(stackPos[2].getValue());
            stackPos[2].setValue(stackPos[1].getValue());
            stackPos[1].setValue(stackPos[0].getValue());
            stackPos[0].setValue(endProduct);
            break;
        default:
            break;
        }
    }

    system("pause");
    return 0;
}

2 个答案:

答案 0 :(得分:1)

您收到错误,因为operator+可以解决的stackPos[1] + stackPos[0]确实没有重载。你唯一的重载是WhackyRPN::operator+(WhackyRPN*);类型(即使你写了一个数组,它也是一个指针 - 阅读herehere。但这与这个问题无关。)签名应为WhackyRPN::operator+(WhackyRPN)。更惯用的是WhackyRPN::operator+(const WhackyRPN&)。如需更多信息,请阅读此精彩文章answer

答案 1 :(得分:0)

替换

int finalNum = stackPos[1] + stackPos[0];

int finalNum = stackPos[1].getValue() + stackPos[0].getValue();

在您的程序中,您拥有对象数组stackPos[],其中包含函数setValue()getValue(),它们分别获取和返回整数。你需要在这里使用getValue(),因为数组元素本身不是整数,它们是对象。

这正是你的错误陈述所说的。但您似乎已经知道这一点,因为您已在*/操作中实施了它。

希望这有帮助。