Co do kodu, to miała to być taka tam klasa, a właściwie lista dwukierunkowa - kwestia podejścia do tematu. Pchnęła mnie do tego chęć eksperymentowania, bo jak wiadomo powszechnie, tak się można najszybciej nauczyć. Jednak po napisaniu tego pojawił się dziwny problem.
Funkcja repair() nie robi tego co powinna w zakresie zmiany wskaźnika dla pierwszej osoby, natomiast dla drugiej jest ok.
Moje pytania:
- czemu tak się dzieje, że tylko dla pierwszej osoby tak jest
- co robię źle(tutaj ogólnie)
- co polecacie(jak to poprawić)
EDIT: Teraz jak to zamieściłem, to już wiem gdzie jest błąd. Operuję na wskaźniku do obiektu, który chcę zmienić:
Kod: Zaznacz cały
this->repair(&a,a.getNext());
EDIT2: Hmm przez te chwilę zdążyłem coś wymyślić, co działa(sprawdziłem dla 4 elementów ;P).
Wiem, że to dziwnie wygląda tak okrężnie się odwoływać, ale adres bitowy &a i *a(i do tego też jakby ktoś mnie oświecił ^^) był inny, więc też musiałem przyrównać to do wskaźnika i wybrałem przez następny obiekt. Domyślam się, iż jest na to lepszy sposób, ale obecnie mi nic nie przychodzi do głowy, a i inne rzeczy czekają .
Proszę o jakiś komentarz do zmiany i również radę ;p
tutaj zmiana repair():
Kod: Zaznacz cały
void repair(person *a, person *b){
this->setNext(b);
this->setPrev(a);
if(a==b){
b->setNext(this);
b->setPrev(this);
}
else if(a!=b){
a->setNext(this);
b->setPrev(this);
}
}
Kod: Zaznacz cały
person(string name,double height,person a){
this->name = name;
this->height = height;
prev=this;
next=this;
repair(a.getNext()->getPrev(),a.getNext());
}
A tu kod całości:
Kod: Zaznacz cały
#include <iostream>
#include <conio.h>
using namespace std;
class person{
private:
string name;
double height;
person *next;
person *prev;
void repair(person *a, person *b){
a->setNext(this);
b->setPrev(this);
this->setPrev(a);
this->setNext(b);
}
void setNext(person *b){
next = b;
}
void setPrev(person *a){
prev = a;
}
public:
person(string name,double height){
this->name = name;
this->height = height;
prev = this;
next = this;
}
person(string name,double height,person a){
this->name = name;
this->height = height;
prev=this;
next=this;
this->repair(&a,a.getNext());
}
person *getNext(){
return next;
}
person *getPrev(){
return prev;
}
string getName(){
return name;
}
double getHeight(){
return height;
}
void drukuj(){
if(this!=NULL){
cout << "Imie: " << this->getName() << " " << "Wzrost: " << this->getHeight() << endl;
}
}
};
int main(){
person a("Adam",184);
person b("Ewa",190,a);
a.getNext()->drukuj();
getch();
return 0;
}