Хорошо, это мой код:
#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;
Затем программа успешно собирается и запускается.
Как я могу сделать это «cout» успешно?
В конструкторе этого класса:
class ListaCircular{
public:
Nodo *PrimerNodo,*UltimoNodo;
ListaCircular(){
*PrimerNodo->siguiente=*UltimoNodo;
}
};
вы пытаетесь разыменовать неинициализированный указатель PrimerNodo
, который производит неопределенное поведение. В вашем случае это приводит к ошибка сегментации (что на самом деле хорошо, потому что в противном случае такого рода ошибки могут быть трудно найти).
Одним из возможных решений является создание этих объектов типа Nodo
в теле конструктора:
ListaCircular(){
PrimerNodo = new Nodo();
UltimoNodo = new Nodo();
PrimerNodo->siguiente = UltimoNodo;
}
Также обратите внимание, что эта строка:
cout << a->PrimerNodo->siguiente << endl;
напечатает адрес памяти, a->PrimerNodo->siguiente
указывает на.
Я все еще новичок в C ++, так что, возможно, я ошибаюсь, но не должно ли это быть Primernodo->siguiente=Ultimonodo
? в ListaCircular
учебный класс..
Кроме того, что именно вы пытаетесь напечатать? Вы пытаетесь напечатать объект или как? Вы можете добавить еще один ‘->’ после «Siguiente, как» cout<<<a->PrimerNodo->siguiente->toString<< endl;
или похожие..
так должно быть:
PrimerNodo->siguiente=UltimoNodo
Но, UltimoNodo
не инициализируется, поэтому разыменование может быть незаконным (UB).
Определите новую функцию связи Nodo: —
void Nodo::SetSiguiente(Nodo*sig){
siguiente=sig;
sig->anterior=this;
}
Исправить конструктор: —
ListaCircular(){
PrimerNodo = new Nodo;
UltimoNodo = new Nodo;
PrimerNodo->SetSiguiente(UltimoNodo);
UltimoNodo->SetSiguiente(PrimerNodo);
}