2017-08-19 7 views
1

Ich bin neu in der Programmierung in C++. Auch neu bei der Implementierung von Stacks. Mein Ziel ist es RPN Calculator mit Template Stack zu erstellen. Kann nicht die eingebauten Stack-Klassen verwenden.C++ add Wert in Stapel tiefgestellt erfordert Array oder Zeigertyp und Warnung

Ich habe alles bisher und jetzt bin ich fest, ich kann nicht daran denken, wie dieses Problem zu beheben. Ich bin zur Zeit diese Fehler bekommen:

Error C2109 subscript requires array or pointer type 
Warning C4244 'return': conversion from 'double' to 'int', possible loss of data 

Das ist meine Stack-Klasse:

#include<stack> 
#define STACK_MAX 500 

template<class T> 
class RPNCalculator 
{ 
private: 
    //Insanciating stack class 
    T data[STACK_MAX]; 
    int size; 

    //stack<T> rpnstack; 


public: 
    RPNCalculator() { 
     size = 0; 
    } 

    ~RPNCalculator(); 

    int Top() { 

     if (size == 0) { 
      fprintf(stderr, "Error: stack empty\n"); 
      return -1; 
     } 
     return data[size - 1]; 
    } 

    void push(T data); // pushes a new operand onto the stack 
          // the following operations are to be performed as defined for Reverse Polish Notation 
          // binary operators: 
    T value(); // returns the topmost value 
    void pop();  // returns the topmost value and pops it off the top 

    double add(); 
    double subtract(); 
    double multiply(); 
    double divide(); 
    // unary operators: 
    double square(); // squares the current value 
    double negate(); // negates, i.e. 3 becomes -3 
    bool isEmpty(); // tests to see if there are elements on the stack 
    void clear(); // clears out the stack 



}; 

template<class T> 
inline bool RPNCalculator<T>::isEmpty() 
{ 
    bool status; 

    if (!top) 
     status = true; 
    else 
     status = false; 

    return status; 
} 

template<class T> 
void RPNCalculator<T>::clear() 
{ 

} 

template<class T> 
inline RPNCalculator<T>::~RPNCalculator() 
{ 
} 

template<class T> 
inline void RPNCalculator<T>::push(T data) 
{ 
    if (size < STACK_MAX) 
     data[size++] = data; 
    else 
     fprintf(stderr, "Error: stack full\n"); 

} 

template<class T> 
inline T RPNCalculator<T>::value() 
{ 
    return T(); 
} 

template<class T> 
inline void RPNCalculator<T>::pop() 
{ 
    if (size == 0) 
     fprintf(stderr, "Error: stack empty\n"); 
    else 
     size--; 
} 

Das ist meine Hauptklasse:

#include <iostream> 
#include "RPNCalculator.h" 
#include <string> 
#include <sstream> 

using namespace std; 


bool isOperator(const string& input); 
void performOperation(const string& st, RPNCalculator<double>& rpnstack); 

int main() { 
    cout << "Welcome to the RPN Calculator by AbdulFatai Saliu __D00168401" << endl; 
    cout << "Enter c to clear \n" 
     << "s to square \n" 
     << "n to negate \n" 
     << "p to pop current value \n" 
     << "q to quit \n" 
     ; 

    RPNCalculator<double> rnpstack; 

    string input; 
    while (true) { 

     //Dispaly prompt 
     cout << ">> "; 


     //get user input 
     cin >> input; 


     //check for numeric values 
     double numereric; 
     if (istringstream(input) >> numereric) { 

     } 
     else if (isOperator(input)) { 

     } 
     else if (input == "q") { 
      return 0; 
     } 
     else { 
      cout << "Input Not Valid" << endl; 
     } 
     //check for operators 

     //check for exit 

     // display invalid value message 
    } 


    system("PAUSE"); 

    //return 0; 
} 

bool isOperator(const string& input) { 
    string operators[] = { "-","+","*","/"}; 

    for (int i = 0; i < 6; i++) { 
     if (input == operators[i]) { 
      return true; 
     } 
    } 

    return false; 
} 

void performOperation(const string& input, RPNCalculator<double>& rpnstack) { 
    double firstValue, secondValue, result; 

    firstValue = rpnstack.Top(); 
    rpnstack.pop(); 
    secondValue = rpnstack.Top(); 
    rpnstack.pop(); 

    if (input == "-") { 
     result = secondValue - firstValue; 
    } 
    else if (input == "+") { 
     result = secondValue + firstValue; 
    } 
    else if (input == "*") { 
     result = secondValue * firstValue; 
    } 
    else if (input == "/") { 
     result = secondValue/firstValue; 
    } 

    cout << result << endl; 

    rpnstack.push(result); 


} 

das Problem aus meiner push() Methode zu kommen scheint, in der Vorlagenklasse RPNCalculator.

+1

'data [size ++] = data;' Hier beziehen sich beide Instanzen von 'data' auf den Funktionsparameter' data', nicht auf das Klassenmitglied, das auch 'data' heißt. Sie scheinen zu erwarten, dass der Compiler Ihre Gedanken liest und magisch erraten, welches Objekt Sie zu einem bestimmten Zeitpunkt meinen. Verwechsle dich nicht, gib verschiedenen Dingen eindeutige Namen. –

+0

also irgendwelche Änderungen in der Art? :( – Destructor2017

+0

Ich kann diese Frage nicht analysieren. –

Antwort

0

Sieht so aus, als ob Sie einen Parameter für die Funktion void push(T data); haben, wobei der Parameter den gleichen Namen wie das Klassenelement hat (data, Ihr Speicher). Versuchen Sie, den Parameternamen in der Funktionsimplementierung zu ändern, die diesen Konflikt nicht ergibt. Sie können auch angeben, welche data Sie verwenden möchten, wenn Sie diesen Namen wirklich verwenden möchten.

versuchen diese stattdessen

template<class T> 
inline void RPNCalculator<T>::push(T arg) 
{ 
    if (size < STACK_MAX) 
     data[size++] = arg; 
    else 
     fprintf(stderr, "Error: stack full\n"); 

} 

oder, wenn Sie explizit sein wollen, welche Daten Sie

template<class T> 
inline void RPNCalculator<T>::push(T data) 
{ 
    if (size < STACK_MAX) 
     this->data[size++] = data; // this->data is the member, data is the function local variable 
    else 
     fprintf(stderr, "Error: stack full\n"); 

} 

zuweisen Dies wird durch die Benennung der Elementvariablen in einer Weise, in der Regel vermieden, wo es können keine Konflikte sein. Eine Möglichkeit besteht darin, Ihren Mitgliedern m_ voran zu stellen, wobei datam_data werden würde. Fühlen Sie sich frei, jede Art von Code zu verwenden, die Sie wollen, aber ich würde vorschlagen, Konflikte zu vermeiden (und den zweiten Ansatz), wenn möglich.

+0

Danke dafür. Haben Sie auch eine Idee, warum nichts gedruckt wird, wenn ich versuche, Wert im Stapel zu drucken.? – Destructor2017

+0

@ Destructor2017 Ich kann nichts von Ihrem Code zum Drucken sehen Kannst du eine neue Frage mit dem Code posten und welche Probleme hast du? Fühlen Sie sich frei, diese Frage hier zu verknüpfen. – N00byEdge

+0

hey danke ich dachte, was das Problem damit war. – Destructor2017

Verwandte Themen