#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:
У вас перегружен оператор предварительного уменьшения, и вы используете оператор после уменьшения.