2016-10-29 17 views
-1

こんにちは、私はこれを適切にタイトルする方法を知らなかった。私が持っているクエリは、私が作ったスタックの実装です。コードで私はthis-> push()またはthis-> pop()を使うことができますが、スコープ演算子は必要です(stack :: push)。私は理解できませんなぜですか?スタッククラスから継承

#include <iostream> 
#include <stack> 


template <class T > 
class SpecialStack : std::stack<T> 
{ 

public: 

    SpecialStack() : isEmpty(true) {}; 

    void push(T element) 
    { 
     if (!isEmpty) 
     { 
      T LastMin = min_stack.top(); 

      if (element < LastMin) 
      { 
       min_stack.push(element); 
      } 
      else 
      { 
       min_stack.push(LastMin); 
      } 
     }else 
     { 
      min_stack.push(element); 

     } 
     stack::push(element); // works 
     //this->push(element); // Unhandled Exception 
    } 

    T pop() 
    { 
     min_stack.pop(); 
     T out = stack::top(); 
     stack::pop(); 
     return out; 

    } 

    T getMin() 
    { 
     return min_stack.top(); 

    } 
private: 

    std::stack<T> min_stack; 

    bool isEmpty; 

}; 


int main() 
{ 
    SpecialStack<int> s; 
    s.push(3); 
    s.push(2); 
    s.push(1); 
    s.push(5); 
    s.push(6); 
    //cout << s.getMin() << endl; 

    s.pop(); 
    s.pop(); 
    s.pop(); 

    std::cout << s.getMin() << std::endl; 

    system("pause"); 




} 
+4

"is-a"または "has-a"スタックのクラスですか?私はあなたがstd :: stackから継承したいとは思っていませんし、std :: stack型のメンバーを持っています。 –

+0

エラーメッセージは何ですか?あなたの 'isEmpty'は決してfalseに更新されません。 – yd1

+1

投稿したコードはコンパイルされません。 – Galik

答えて

4
void push(T element) { 
    ... 
    this->push(element); 
} 

最後の行は、再帰的にあなたのpush関数を呼び出します。プロセスは決して終了しないので、スタックオーバーフロー例外が発生しています。

stack::pushは、コンパイラに親クラスから実装を呼び出す正しい方法です。

+0

はい、あなたは正しいです、何らかの理由で私はこれが親クラスを参照すると仮定しました。ありがとうございました! – Phil15