在Mac上的c++中无法重载'——'操作符

Overloading `--` operator is not working in C++ on Mac

本文关键字:操作符 重载 上的 Mac c++      更新时间:2023-10-16

我正在尝试在c++中重载操作符。
我正在创建一个自定义堆栈数据结构。

这是headers目录下的Stack.h:

/*******************************************************************************
 * Stack --                                                                    *
 * This class will just interface a stack of integers.                         *
 * A stack is a linear data structure. Elements are pushed into stack from the *
 * bottom and is popped from the top.                                          *
 *                                                                             *
 * Author -- Aditya R.Singh                                                    *
 * Version -- 1.0                                                              *
 * Since -- 2014-06-24                                                         *
 *******************************************************************************/

#ifndef STACK_H
#define STACK_H

class Stack {
    public:
        Stack();                 // To initiallize stuff.
        void operator>>(int);    // To push elements in the stack.
        int operator--();        // To pop element from the stack.
        void display_stack();    // To display the whole stack.

    private:
        typedef struct stack {
            int data;
            struct stack *top, *previous;
        } node;                           // The structure of the whole stack.
        node *PTR;                        // To point to the top of the stack.
        node *BUFFER;                     // To temporarily store the node to be     freed.
        int data;                         // Data to be popped from the stack.
        int choice;                       // To get choice of the user. 
};

#endif 

我的Stack.cpp文件,在我的sources目录是:

/*******************************************************************************
 * Stack --                                                                    *
 * This file contains the implementation of all functions from the class Stack.*
 *                                                                             *
 * Author -- Aditya R.Singh                                                    *
 * Version -- 1.0                                                              *
 * Since -- 2014-06-24                                                         *
 *******************************************************************************/

#include <iostream>
#include "../headers/Stack.h"

using namespace std;

Stack::Stack() {
    PTR->top = NULL;
    PTR->previous = NULL;
}

void Stack::operator>>(int data) {
    PTR = (node*)malloc(sizeof(node));
    PTR->previous = PTR->top;
    PTR->top = PTR;
    PTR->data = data;
}    

int Stack::operator--() {
    BUFFER = PTR->top;
    data = BUFFER->data;
    PTR->top = PTR->previous;
    free(BUFFER);
    return data;
}    

void Stack::display_stack() {
    BUFFER = PTR;

    while(BUFFER != NULL) {
        cout << BUFFER->data << endl;
        BUFFER = BUFFER->previous;
    }
}

我的Main.cppsources目录:

/*******************************************************************************
 * Main --                                                                     *
 * This program will demonstrate the use of a stack.                           *
 *                                                                             *
 * Author -- Aditya R.Singh                                                    *
 * Version -- 1.0                                                              *
 * Since -- 2014-06-24                                                         *
 *******************************************************************************/

#include <iostream> 
#include "../headers/Stack.h"

using namespace std;

int get_choice() {
    int choice = 0;

    cout << "*************************************" << endl;
    cout << "************     STACK    ***********" << endl;
    cout << "*************************************" << endl;
    cout << "********** 0> QUIT APP      *********" << endl;
    cout << "********** 1> PUSH          *********" << endl;
    cout << "********** 2> POP           *********" << endl;
    cout << "********** 3> DISPLAY STACK *********" << endl;
    cout << "********** 4> CLEAR CONSOLE *********" << endl;
    cout << "*************************************" << endl;
    cout << endl << "Enter choice = ";
    cin >> choice;

    return choice;
}

int main() {
    Stack stack;
    int choice = -1;
    int data;

    while(choice) {
        choice = get_choice();

        switch(choice) {
            case 1: cout << "Enter number to be pushed = ";
                    cin >> data;
                stack >> data;
                break;
            case 2: cout << "Just pushed " << stack-- << endl;
                break;
            case 3: stack.display_stack();
                    break;
            case 4: system("clear");
                    break;
            default: cout << "Invalid choice!"  << endl;
                     break;                         
        }
    }

    return 0;
}  

我的headers, sourcesobjects目录在Stack目录下。
我的终端指向Stack目录。
现在我像这样编译Stack.cpp文件:

gcc -c sources/Stack.cpp -o objects/Stack.o

它编译得很好,并在objects目录中生成了Stack.o文件。

但是当我像这样编译Main.cpp文件时:

gcc sources/Main -o Stack objects/Stack.o

显示如下错误:

Main.cpp:66:43: error: cannot decrement value of type 'Stack'
                    case 2: cout << "Just pushed " << stack-- << endl;

当我试图--(递减)stack的值时,它发现了一些问题。但是我在class Stack中重载了--运算符。那么可能的问题是什么呢?

请帮。

您已经重载了预减量运算符int operator--();,但是您正在使用具有重载签名int operator--(int);的后减量运算符。int参数只是一个标记,用于区分前缀和后缀版本。

您重载了预减量操作符,并且正在使用后减量操作符