Konstruktor kopiujący. Listy jednokierunkowe

0

Witam,

Czy podpowie mi ktoś, jak mam wywołać konstruktor kopiujący w przypadku, gdy działam dynamicznie na listach jednokierunkowych?

Np tu:

 
#include <iostream>

using namespace std;

class auta{
protected:
    int x,y;
    auta *nast;
 
public:
    auta(int x, int y):
    x(x), y(y) {}
 
     auta(auta &mk):
          x(mk.x), y(mk.y) {}
 
 

void wypisz(){
  cout << x << y<<  endl;
}
};
 
class lista {

	friend class auta;
private:
   auta *glowa;
 
public:
lista():
   glowa(NULL) {}
 
void dodaj_auto(auta *dodaj){
    if(glowa == NULL){
      glowa=dodaj;
	  glowa->nast = NULL;
 
    }else {
      auta *w;
      for(w=glowa ; w->nast!=NULL ; w= w->nast);
         w->nast = dodaj;
         w->nast->nast = NULL;
 
}
}
 
void pokaz(){
   auta *a;
 
        for(a=this->glowa;a!=NULL;a=a->nast)
            a->wypisz();
}      

 
};
 
int main(){
   auta *a1 = new auta(2,2);
 
  ////////////TU JAK WYWOLAC KOPIUJACY/////////
 
lista *nowa = new lista();
 
nowa->pokaz();
 
delete nowa;
 
return 0;
}

Nie kompilowałem tego, nie pisałem tego w kompilatorze także za wszelkie błędy oraz brak odpowiednich wcięć przepraszam. To jest kod tylko tak dla przykładu. Jeśli kogoś to bardzo razi, to mogę wkleić kod mojego programu, aczkolwiek jest o wiele dłuższy. Edit: Dobra, trochę poprawiłem

0
lista *nowa=new lista; 

automatycznie powinien wywołać konstruktor bez parametrów, nie musisz dawać nawiasów, szukam dalej :)

0

w jakim sensie wywołać konstruktor kopiujący? co kopiujesz? dokąd kopiujesz?

0

z tego co wiem kopiujący można wywołać tak:

klasa b=a;//a jest obiektem klasy klasa 
0

Przepraszam za brak aktywności. Właśnie robiłem tak jak napisał @Niikelion i śledząc program krok po kroku zauważyłem, że zapisują się te wartości z obiektu a w obiekcie b, ale jakoś nie mogę tego wypisać.

0

Daj może kod (to co próbujesz), oczekiwany wynik, oraz (opcjonalnie) to co się faktycznie dzieje.

0


#include <iostream>
#include <stdlib.h>

using namespace std;

class silnik{
protected:
	int moc;
	int rozmiar;
	
public:
	silnik *nast;
	//////////konstruktor domysln
	silnik():
	moc(100),  rozmiar(1500){}

	/////////////////////konstruktor 2
	silnik(int moc, int rozmiar):
	moc(moc), rozmiar(rozmiar) {}

	///////////////konstruktor kopiujacy
	silnik(silnik &mk):
	moc(mk.moc), rozmiar(mk.rozmiar) {}

	////DESTR

	~silnik() {delete this->nast;}

	////setter

	void setMoc(int moc) {this->moc = moc;}
	void setRozmiar(int rozmiar) {this->rozmiar = rozmiar;}

	//gettery

	int getMoc () {
		return moc;
	}
	int getRozmiar() {return rozmiar;}

	////wypisz

	void wypisz(){
		cout << ".....................................\n";
		//cout << "SILNIKI\n" << endl;
		cout << "Moc: " << this->moc << endl;
		cout << "Pojemnosc: " << this->rozmiar << "ccm" << endl;
	}

};

class samochod{
protected:
	int cena;
	char* rodzajSilnika;

	
public:
	samochod *nast;

	//////////konstruktor domyslny
	samochod():
	cena(10000), rodzajSilnika("diesel") {}

	//Konstruktor z argumentami
	samochod(int cena, char* rodzajSilnika):
	cena(cena), rodzajSilnika(rodzajSilnika) { }//samochod();

	///////konstruktr kopiujacy

	samochod(samochod &mk):
	cena(mk.cena), rodzajSilnika(mk.rodzajSilnika) {}

	///destruktor
	~samochod() {delete this->nast;}
	
	//setter

	void setCena (int cena) {this->cena = cena;}
	void setSilnik (char *rodzajSilnika) {this->rodzajSilnika = rodzajSilnika;}

	///getery

	int getCena() {return cena;}
	char *getRodzaj() {return rodzajSilnika;}

	////wypisywanie

	void wypisz(){
		cout << ".....................................\n";
		//cout << "SAMOCHODY\n" << endl;
		cout << "Cena: " << this->cena << "$" << endl;
		cout << "Rodzaj silnika: " << this->rodzajSilnika << endl;

	}
};

class urzadzenieop{
protected:
	int waga;
	int zoom;
	char *matryca;
	
public:

	urzadzenieop *nast;

	////////k1

	urzadzenieop():
	waga(1), zoom(5), matryca("CCD") {}

	//////k2

	urzadzenieop(int waga, int zoom, char *matryca):
	waga(waga), zoom(zoom), matryca(matryca){}

	//////k2

	urzadzenieop(urzadzenieop &mk):
	waga(mk.waga), zoom(mk.zoom), matryca(mk.matryca){}

	///destuktor

	~urzadzenieop() {delete nast;}

	//////setter

	void setWaga(int waga) {this->waga = waga;}
	void setZoom (int zoom) {this->zoom = zoom;}
	void setMatryca (char *matryca) {this->matryca = matryca;}

	//getery

	int getWaga() {return waga;}
	int getZoom() {return zoom;}
	char *getMatryca() {return matryca;}

	////wypisz

	void wypisz(){
		cout << ".....................................\n";
		//cout << "\nAPARATY\n" << endl;
		cout << "Waga: " << waga << endl;
		cout << "Zoom: " << zoom << endl;
		cout << "Matryca: " << this->matryca << endl;
		cout << endl;


	}
};

class osoba{
protected:
	char *imie;
	char *nazwisko;
	char *mail;
	
public:
	osoba *nast;

	////k1
	osoba():
	imie("Adam"), nazwisko("Usiadek"), mail("[email protected]") {}

	///k2
	osoba(char *imie, char *nazwisko, char *mail):
	imie(imie), nazwisko(nazwisko), mail(mail) {}

	//k3

	osoba(osoba &mk):
	imie(mk.imie), nazwisko (mk.nazwisko), mail(mk.mail) {}

	////destruktor

	~osoba() {delete this->nast;}

	////setter

	void setImie(char *imie) {this->imie = imie;}
	void setNazwisko (char *nazwisko) {this->nazwisko = nazwisko;}
	void setMail (char * mail) {this->mail = mail;}


	////getter

	char *getImie() {return imie;}
	char *getNazwisko () {return nazwisko;}
	char* getMail() {return mail;}

	//////wypisz

	void wypisz(){
		cout << ".....................................\n";
		//cout << "OSOBY NA UCZELNIE\n" << endl;
		cout << "Imie: " << imie << endl;
		cout << "Nazwisko: " << nazwisko << endl;
		cout << "mail: " << mail << endl; 
		cout << endl;
	}
};


///././././././././././././././././././././././

class lista{
private:
	silnik		 *silnikGlowa;
	samochod	 *samochodGlowa;
	urzadzenieop *urzadzenieGlowa;
	osoba		 *osobaGlowa;

public:
	lista():
	  silnikGlowa(NULL), samochodGlowa(NULL), urzadzenieGlowa(NULL), osobaGlowa(NULL){}

		~lista (){
			delete this->osobaGlowa;
			delete this->samochodGlowa;
			delete this->silnikGlowa;
			delete this->urzadzenieGlowa;
		}

		void dodaj(silnik *dodaj){
		
			if(this->silnikGlowa==NULL){
			  this->silnikGlowa=dodaj;
			  this->silnikGlowa->nast=NULL;
		  }else{
			  silnik *w;
			  for(w = this->silnikGlowa;w->nast!=NULL;w=w->nast);
			  w->nast=dodaj;
			  w->nast->nast=NULL;
		  }
	  }


			void dodaj(samochod *dodaj){
		
			if(this->samochodGlowa==NULL){
			  this->samochodGlowa=dodaj;
			  this->samochodGlowa->nast=NULL;
		  }else{
			  samochod *w;
			  for(w = this->samochodGlowa;w->nast!=NULL;w=w->nast);
			  w->nast=dodaj;
			  w->nast->nast=NULL;
		  }
	  }

			void dodaj(urzadzenieop *dodaj){
				if(this->urzadzenieGlowa == NULL){
					urzadzenieGlowa = dodaj;
					urzadzenieGlowa->nast = NULL;
				}else{
					urzadzenieop *w;
					for(w = urzadzenieGlowa; w->nast != NULL ; w=w->nast);
						w->nast = dodaj;
						w->nast->nast=NULL;
				}
			}

		void dodaj(osoba *dodaj){
			
			if(this->osobaGlowa==NULL){
				  this->osobaGlowa=dodaj;
				  this->osobaGlowa->nast=NULL;
		  }else{
			  osoba *w;
			  for(w = this->osobaGlowa;w->nast!=NULL;w=w->nast);
			  w->nast=dodaj;
			  w->nast->nast=NULL;
		  }
	  }
		
		void pokaz(){
			silnik		 *a;
			samochod	 *b;
			urzadzenieop *c;
			osoba		 *d;
			cout << "\n\nSILNIKI\n" << endl;
		for(a=this->silnikGlowa;a!=NULL;a=a->nast)
			a->wypisz();
		cout << endl;
		cout << "\nSAMOCHODY\n" << endl;
		for(b=this->samochodGlowa;b!=NULL;b=b->nast)
			b->wypisz();
		cout << endl;
		cout << "\nURZADZENIA OPTYCZNE\n" << endl;
		for(c=this->urzadzenieGlowa;c!=NULL;c=c->nast)
			c->wypisz();
		cout << endl;
		cout << "\nOSOBY NA UCZELNI\n" << endl;
		for(d=this->osobaGlowa;d!=NULL;d=d->nast)
			d->wypisz();
		cout << endl;
	  }
};

int main(){

	silnik *s1 = new silnik();
	silnik *s2 = new silnik(150, 1998);
	silnik *s3 = new silnik(190, 2500);
	silnik *s4 = new silnik(224, 3200);
	silnik *kopia = new silnik;
	kopia = s4;

	samochod *sa1 = new samochod();
	samochod *sa2 = new samochod(20000, "Benzyna");
	samochod *sa3 = new samochod(30000, "diesel");
	samochod *sa4 = new samochod(40000, "LPG");
	//samochod *kopia1 = new samochod;
	

	urzadzenieop *u1 = new urzadzenieop();
	urzadzenieop *u2 = new urzadzenieop(1,10,"CMOS");
	urzadzenieop *u3 = new urzadzenieop(2, 11, "CCD");
	urzadzenieop *u4 = new urzadzenieop(1,5,"CCD");

	osoba *o1 = new osoba();
	osoba *o2 = new osoba("Janusz", "Polak", "[email protected]");
	osoba *o3 = new osoba("Krystyna", "Kowalska", "[email protected]");
	osoba *o4 = new osoba("Michal", "Nowak", "[email protected]");

	lista *nowa = new lista();

	nowa->dodaj(s1);
	nowa->dodaj(s2);
	nowa->dodaj(s3);
	nowa->dodaj(s4);
	nowa->dodaj(kopia);

	nowa->dodaj(sa1);
	nowa->dodaj(sa2);
	nowa->dodaj(sa3);
	nowa->dodaj(sa4);

	nowa->dodaj(u1);
	nowa->dodaj(u2);
	nowa->dodaj(u3);
	nowa->dodaj(u4);

	nowa->dodaj(o1);
	nowa->dodaj(o2);
	nowa->dodaj(o3);
	nowa->dodaj(o4);

	nowa->pokaz();

	delete nowa;

	return 0;
}

 

Co się wyświetla w oknie konsoli? Po prostu te obiekty z int maina, prócz elemnetu który ma być kopią. A właśnie tego dotyczy moje pytanie. I chciałbym wywołać ten kostruktor kopiujący, a nie przypisać do obiektu kopia wartości obiektu kopiowanego.
Coś w tym stylu, tylko że pod mój program zrobiony na listach.

 
 osoba KopiaPierwszejOsoby( * PierwszaOsoba );
1
  1. W Twoim przypadku składniki klasy i parametry konstruktorów powinny mieć typ const char*.
  2. Składnik nast powinien być zainicjowany w konstruktorze domyślnym.
osoba(const char *imie, const char *nazwisko, const char *mail):
    imie(mk.imie), nazwisko (mk.nazwisko), mail(mk.mail), nast(0)
{}
  1. Konstruktor kopiujący może wyglądać tak
osoba(const osoba &mk):
    imie(mk.imie), nazwisko (mk.nazwisko), mail(mk.mail), nast(0)
{
    const osoba *w = mk.nast;
    while (w)
    {
        osoba *nowa = new osoba(w->imie, w->nazwisko, w->mail);
        dodaj(nowa);
        w = w->nast;
    }
}

Można też krócej z wykorzystaniem rekurencji

osoba(const osoba &mk):
    imie(mk.imie), nazwisko (mk.nazwisko), mail(mk.mail), nast(mk.nast ? new osoba(*mk.nast) : 0)
{}

1 użytkowników online, w tym zalogowanych: 0, gości: 1