2013-12-09 5 views
5

Ich versuche, meine eigene Klasse (NodeWithMin) als Elemente für den Stapel in C++ zu erstellen, und erstellen Sie eine neue Klasse (StackWithMin) erben. Ich denke, ich bin in Ordnung, die neue Stapelklasse zu erstellen, aber ein Problem zu haben, initialisiere eine neue Instanz der neuen Klasse und benutze sie. Hat jemand eine gute Idee damit? Ich habe alle Klassen und main in einer einzigen Datei geschrieben. Vielen Dank.C++ Erben Stack mit Elementen mit eigener Klasse

#include <stack> 

class NodeWithMin{ 
public: 
    int value; 
    int min; 
    NodeWithMin(int v, int min){ 
     this->value = v; 
     this->min = min; 
    } 
}; 

template<class NodeWithMin> 
class StackWithMin : stack<NodeWithMin>{ 
public: 
    typedef stack<NodeWithMin> super; 
    void push(int value){ 
     int newMin = min(value, this->min()); 
     super::push(new NodeWithMin(value, newMin)); 
    }; 

    int min(){ 
     if(this->isEmpty()){ 
      return numeric_limits<int>::max(); 
     }else{ 
      super::peek().min; 
     } 
    }; 
}; 

int main(int argc, const char * argv[]) 
{ 
    StackWithMin<class NodeWithMin>* ss; 
    ss = new StackWithMin<class NodeWithMin>(); 
} 
+0

Lassen Sie einfach wissen, dass ich Ihren Code erfolgreich mit CodeBlock 12.11, gcc 4.7 – David

+3

gebaut habe Können Sie genauer auf Ihre Probleme eingehen? Was funktioniert nicht? Gibt es Compiler-Nachrichten? Laufzeitfehler? –

Antwort

2

Zunächst einmal, entfernte ich

using namespace std; 

So kann ich std qualifizieren Unklarheiten zu beseitigen.

Das erste Problem, das ich diese Linie bemerkt:

int newMin = min(value, this->min()); 

Meine Vermutung ist, Sie versuchen, min von algorithm (seit stack nicht enthalten eine min Funktion) zu verwenden:

#include <algorithm> 
// snip 
int newMin = std::min(value, this->min()) 

Das zweite Problem ist, dass Sie keine Instanz von haben, nur eine Typedef. Daher müssen Sie es wie folgt verwenden:

 typedef std::stack<NodeWithMin> super; 
     super super_instance; 
     void push(int value){ 
       int newMin = std::min(value, this->min()); 
       // Why are you using new? It would make 
       // It more difficult to avoid memory leaks 
       super_instance.push({value, newMin}); 
     }; 

Das dritte Problem ist stack hat keine Memberfunktion isEmpty genannt, und auch nicht Ihre Klasse. stack hat keine peek Mitgliedsfunktion entweder.

 int min(){ 
       if(super_instance.empty()){ 
         return std::numeric_limits<int>::max(); 
       }else{ 
         return super_instance.top().min; 
       } 
     }; 

Jetzt wird es kompilieren:

int main(int argc, const char * argv[]) 
{ 
    StackWithMin<class NodeWithMin>* ss; 
    ss = new StackWithMin<class NodeWithMin>(); 
    ss->push(42); 
    delete ss; 
} 

ich nicht die Mühe, für logische Fehler zu überprüfen.

1
#include <stack> 
#include <limits> 
using namespace std; 
class NodeWithMin{ 
    public: 
      int value; 
      int min; 
      NodeWithMin(int v, int min){ 
        this->value = v; 
        this->min = min; 
      } 
}; 

template<class NodeWithMin> 
class StackWithMin : stack<NodeWithMin>{ 
    public: 
      typedef stack<NodeWithMin> super; 
      void push(int value){ 
        int newMin = min(value, this->min()); 
        super::push(new NodeWithMin(value, newMin)); 
      }; 

      int min(){ 
        if(this->isEmpty()){ 
          return numeric_limits<int>::max(); 
        }else{ 
          super::peek().min; 
        } 
      }; 
}; 

int main(int argc, const char * argv[]) 
{ 
    StackWithMin<class NodeWithMin>* ss; 
    ss = new StackWithMin<class NodeWithMin>(); 
} 

Bitte diese Code-Segment überprüfen, Sie using namespace std verpasst hatte, und Sie werden #include <limits> umfassen müssen numeric_limits<int>::max(); Funktion zu verwenden.

+0

Außerdem sollten Sie sicher sein, die dynamisch zugewiesene Variable 'ss' in' main' zu löschen. Außerdem sollten Sie einen Wert von 'main' zurückgeben, da er einen Rückgabetyp hat. –

+0

Der Code kompiliert, wie es ist, aber wenn Sie tatsächlich versuchen, es zu verwenden, werden Sie sehen, dass es nicht kompilieren wird. –

Verwandte Themen