1

これは私のコードです:

#include <iostream>
using namespace std;
class Nodo{
public:
    Nodo *siguiente,*anterior;
    string Nombre,Curso,Posicion;
    int carnet;
    Nodo(){
        siguiente=anterior=NULL;
        Nombre=Curso="";
        carnet=0;
    }
};
class ListaCircular{
public:
    Nodo *PrimerNodo,*UltimoNodo;    
    ListaCircular(){
        *PrimerNodo->siguiente=*UltimoNodo;
    }
};

int main(){
    ListaCircular *a=new ListaCircular();
    cout<<a->PrimerNodo->siguiente<<endl;
    return 0;
}    

実行しようとすると、「BUILD SUCCESSFUL」と表示されますが「RUN FAILED」と表示され、デバッグするとSIGSEGVメッセージが表示され、エラーがあると思われる行は次のとおりです。

*PrimerNodo->siguiente=*UltimoNodo;

しかし、行なしでプログラムを再度実行すると:

ListaCircular *a=new ListaCircular();
cout<<a->PrimerNodo->siguiente<<endl;

その後、プログラムは正常にビルドおよび実行されます。

その「カウト」を成功させるにはどうすればよいですか?

4

4 に答える 4

3

このクラスのコンストラクターでは:

class ListaCircular{
public:
    Nodo *PrimerNodo,*UltimoNodo;    
    ListaCircular(){
        *PrimerNodo->siguiente=*UltimoNodo;
    }
};

初期化されていないポインターを逆参照しようとしていますPrimerNodo。これにより、未定義の動作が発生します。あなたの場合、セグメンテーション違反が発生します(そうでなければ、この種のエラーを見つけるのは難しいかもしれないので、これは実際には良いことです)。

Nodo考えられる解決策の 1 つは、コンストラクターの本体内にこれらの型のオブジェクトを作成することです。

ListaCircular(){
    PrimerNodo = new Nodo();
    UltimoNodo = new Nodo();
    PrimerNodo->siguiente = UltimoNodo;
}

また、次の行にも注意してください。

cout << a->PrimerNodo->siguiente << endl;

a->PrimerNodo->siguienteを指すメモリのアドレスを出力します。

于 2013-03-10T18:36:59.943 に答える
1

私はまだC ++に慣れていないので、間違っているかもしれませんが、そうではありませんPrimernodo->siguiente=Ultimonodoか? ListaCircularクラスで..

また、正確に何を印刷しようとしていますか?オブジェクトを印刷しようとしていますか、それとも何ですか? 「Siguiente, like」cout<<<a->PrimerNodo->siguiente->toString<< endl;などの後に別の「->」を追加することもできます..

于 2013-03-10T18:40:08.523 に答える
0

そのはず:

PrimerNodo->siguiente=UltimoNodo

ただし、UltimoNodo初期化されていないため、逆参照すると不正になる可能性があります(UB)。

于 2013-03-10T18:33:51.110 に答える
0

新しい Nodo リンク関数を定義します:-

void Nodo::SetSiguiente(Nodo*sig){
    siguiente=sig;
    sig->anterior=this;
}

コンストラクターを修正します:-

ListaCircular(){
    PrimerNodo = new Nodo;
    UltimoNodo = new Nodo;

    PrimerNodo->SetSiguiente(UltimoNodo);
    UltimoNodo->SetSiguiente(PrimerNodo);
}
于 2013-03-10T18:45:44.930 に答える