重载`--`运算符在Mac上的C ++中不起作用

时间:2014-06-24 08:07:28

标签: c++ operator-overloading

我试图用C ++重载运算符。
我正在创建一个自定义Stack数据结构。

这是Stack.h目录中的headers

/*******************************************************************************
 * 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.cpp目录中的sources

/*******************************************************************************
 * 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;
}  

我的headerssourcesobjects目录位于Stack目录中。
我的终端指向Stack目录 现在我编译了这样的Stack.cpp文件:

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

编译好并在对象目录中生成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运算符。那么可能的问题是什么?

请帮忙。

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:0)

你有超载的预递减运算符,你正在使用后递减运算符。