2013-12-09 18 views
5

Kendi sınıfım (NodeWithMin) öğesini, C++'da yığın için öğe olarak oluşturmaya çalışıyorum ve onu (StackWithMin) miras alarak yeni bir sınıf oluşturmaya çalışıyorum. Yeni yığın sınıfını oluşturmanın iyi bir şey olduğunu düşünüyorum, ancak bazı problemler yeni sınıfın yeni bir örneğini başlatıyor ve kullanıyor. Bununla ilgili iyi bir fikri olan var mı? Tüm sınıfları ve ana yazıyı tek bir dosyada yazdım. Teşekkürler.C++ Yığınları Sınıfta İçeren Öğelerle Yığınlama

#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

Sadece kodunuzu CodeBlock 12.11, gcc 4.7 – David

+3

ile başarıyla oluşturduğumu bildirin. Hangi sorunları yaşadığınız hakkında daha spesifik olabilir misiniz? Ne işe yaramıyor? Derleyici mesajları var mı? Çalışma zamanı hataları? –

cevap

2

Öncelikle, ben Yani belirsizlikleri uzaklaştırmak std hak kazanabilirler

using namespace std; 

kaldırıldı.

ettim ilk sorun bu satırı:

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

Benim tahminim (a min işlevini içermeyen stack beri) algorithm den min kullanmaya çalışıyorsanız geçerli:

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

İkinci problem, sadece bir yazım hatası olan stack<NodeWithMin> örneğiniz yok. Bu nedenle bu gibi kullanmak gerekir:

üçüncü sorun stack olduğunu
 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}); 
     }; 

isEmpty denilen hiçbir üye işlevi vardır ve ne sınıfınızı yapar. stack,üye işlevine sahip değildir.

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

Şimdi derlenir:

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

Ben mantık hatalarını kontrol rahatsız etmedi.

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>(); 
} 

Eğer using namespace std kaçırmıştı ve numeric_limits<int>::max(); işlevi kullanmak için #include <limits> dahil etmek zorunda kalacak, bu kod segmentini kontrol edin.

+0

Ayrıca, "main" içindeki dinamik olarak ayrılmış değişken ss'yi de silmeniz gerektiğinden emin olmalısınız. Ayrıca, bir dönüş türüne sahip olduğundan, "main" dan bir değer döndürmelisiniz. –

+0

Kod, olduğu gibi iyi derler, ancak gerçekten kullanmaya çalışırsanız, derlenmeyeceğini görürsünüz. –

İlgili konular