Перегрузка оператора `—` не работает в C на Mac

#c #operator-overloading

#c #оператор-перегрузка

Вопрос:

Я пытаюсь перегрузить операторы в C .
Я создавал пользовательскую структуру данных стека.

Это мое 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;
}  
  

Мой headers , sources и objects каталоги находятся в 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 . Итак, в чем возможная проблема?

Пожалуйста, помогите.

Ответ №1:

Вы перегрузили оператор предварительного уменьшения int operator--(); , однако вы используете оператор после уменьшения, который имеет сигнатуру перегрузки int operator--(int); int . Параметр — это просто токен для различения версии префикса и суффикса.

Комментарии:

1. @Aditya Это просто параметр токена, позволяющий различать две версии.

Ответ №2:

У вас перегружен оператор предварительного уменьшения, и вы используете оператор после уменьшения.