0

私の先生はクラスにこのプログラムのエラーを修正するように言いました。実際、これはくだらないプログラムのようです。シートにあるとおりに正確に入力したところ、次のエラーが発生しました。

さて、いくつか変更を加えましたが、実行時に次の例外が発生します: Microsoft C++ exception: [rethrow] at memory location 0x00000000..

コードは次のようになりました: (クラス名の変数はスペイン語になりました。ご不便をおかけして申し訳ありません)

 #include <iostream>
#include <exception>
#include <stack>
using namespace std;

class EPilaVacia : public exception{
public:
    const char* what() const throw(){
        return "Error: Pila Vacía";
    }
};

template <class T, int max=100>
class Pila{
private:
    stack<T*> *pila;
    int cont;
public:

    Pila() : cont(0){
        pila=new stack<T*>();
    }
    virtual void apilar( T* pt){
        if(cont<max){
            pila->push(pt); //respuesta 2
        }
    }
    virtual void apilar(T t){
        if(cont<max){
            pila->push(&t); //respuesta 3
        }
    }
    T tope() const throw (EPilaVacia){
        if(cont>0){
            pila->top(); //respuesta 4
        }else{
            throw ; //respuesta 5
        }
    }
    T& desapilar() throw (EPilaVacia){
        if(cont>0){
            pila->pop(); //respuesta 6
        }else{
            throw ; //respuesta 7
        }
    }
    int size() const{
        return pila->size();
    }
};

class Figura{
public:

    virtual void print(){
        cout<< "FIGURA" <<endl;
    }
};

class Circulo : public Figura{
public:
    void print(){
        cout<<"CIRCULO"<<endl;
    }
};

class Triangulo : public Figura{
public:
    void print(){
        cout<<"TRIANGULO"<<endl;
    }
};

int main(){
    Pila<Figura*> *pfiguras= new Pila<Figura*>();
    pfiguras->apilar(new Circulo());
    pfiguras->apilar(new Triangulo());
    Pila<Figura*> pfiguras2(*pfiguras);
    pfiguras->tope()->print();
    pfiguras->desapilar();
    pfiguras->tope()->print();
    pfiguras->desapilar();

    pfiguras2.tope()->print();
    system("Pause");
    return 0;
}
4

2 に答える 2

7

どこから始めれば?これはエラーが多いです。

  1. 「using namespace std;」を使用しないでください。グローバル名前空間が乱雑になります。むしろ、名前空間を使用して std::list、std::cin などを使用し、特定のオブジェクトまたはクラスを識別します。

  2. what()例外クラスでは、独自のメソッドを記述しないでください。コンストラクターで基本クラスを初期化するだけです。

    class EPilaVacia : public std::exception
    {
    public:
        EPilaVacia()
        : std::exception("Error: Pila Vacía")
        {
        }
    };
    
  3. クラス Pila は単なる学習演習だと思います。実生活std::stackでは、自分で作成するのではなく、 を使用します。

  4. リストを使用してスタックを実装している場合、「max」パラメーターは必要ありません。

  5. リストを動的に割り当てないでください。それはばかげています。使うだけ std::list<T*> ila;

  6. 「つづき」は必要ありません。使用するila.size();

  7. apilar() のような関数を仮想化しないでください。リストはプライベートであるため、サブクラスはアクセスできず、メソッドをオーバーライドできません。また、仮想デストラクタがないため、継承はおそらく悪い考えです。

  8. void apilar(T t) は大惨事です。t を値で渡し、パラメータのアドレスを保存すると、スコープ外になります。その機能は不要です、無くしてください。

  9. メソッド宣言に「throw (EPilaVacia)」を入れないでください。これを実装するコンパイラはなく、新しい C++11 標準では非推奨です。

  10. tope() では、ila.pop_back() ではなく、ila.back() を使用します。

    T tope() const 
    {
        if(ila.empty())
        {
            throw EPilaVacia();
        }
        else
        {
            return *ila.back();
        }
    }
    
  11. desapilar() では、スタックを空にするため、clear を使用しないでください。このようなものを使用してください

    T& desapilar()
    {
        if(ila.empty())
        {
            throw EPilaVacia();
        }
        else
        {
            T *pt = ila.back();
            ila.pop_back();
            return *pt;
        }
    }
    
  12. 絶対に使用しないでsystem("Pause"); くださいstd::cin.get();

  13. 割り当てたオブジェクトnewは決して削除されません。メモリ リークがあります。

おそらく他にもありますが、それで始められるはずです。注:私はこれをすぐに走り書きしました. 上記のエラーがある可能性があるため、コードをコピーするだけでなく、コードを確認してください。

于 2012-06-14T01:56:53.483 に答える
3

このエラーはオンラインで発生していますか?これ"mystack=new stack<T>;"が原因である可能性がある唯一の行です。その理由は、mystack が ではなく T* として定義されているためですstack<T>。コンパイラstack<T>が mystack に new を割り当てようとすると、mystack が T* を探していることがわかり、「T* にする方法がわかりません」と表示stack<T>されます。

そのエラーを修正したので、nullptr 例外からスローが発生しています。これは通常、これをデバッガーで実行し、プログラムの動作不良の原因となっている行を確認することで解決できます。ただし、調べてみると、2 つだけをスタックにプッシュしているように見えます。次に、「top」を使用して 3 つ目のものを取得してみてくださいpfiguras2.tope()->print();

あなたもメモリをリークしていますが、Michael Jのコメントは、このコードの「クラッシュしないようにする」というよりも、より細心の注意を払った領域にはるかに優れています。

于 2012-06-14T00:24:10.527 に答える