Jak poprawnie zastosować operator przypisania i konstruktor kopiujący?

Jak poprawnie zastosować operator przypisania i konstruktor kopiujący?
MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

Hej witajcie :)
Mam problem gdyz musze w moim programie zastosowac operator przypisania i konstruktor kopiujacy do obiektu dynamicznego karta nie mam pojecia jak to zrobic. Prosze o pomoc :)pierwsza klasa to glowna Komputer

Kopiuj
#include <iostream>
#include <cstdio>
#include <cstring>
#include "procesor.cpp"
#include "Karta.cpp"

using namespace std;

typedef int TypDanychT;

class Komputer{
	private:
        	string wykonawca;
		string producent;
		Procesor procesor;
		static int licznik;
        	int dysk;
        	Karta *karta;
        	int ram;


    public:

        Komputer(int x, int y){
        	this->x = x; this-> y = y;
        }
        static int zwrocLicznik() { return licznik; }
        int  x,y;
        Komputer () {
		karta = NULL;

		//cout << "konstruktor" << endl;
		x=3;
		y=5;
		dysk=500;
		ram=2000;
		++licznik;
		#ifdef TESTPR
			cout << "Dziala konstruktor domyslny Komputer()" << endl;
		#endif
        }

	void dodajkarta() {
		if( karta==NULL)
		 	karta= new Karta();
		cout << "dodana karta" << endl;
 	}

	void usunkarta() {
		if(karta)
			delete karta;
		cout << "usunieto karta"<< endl;
	}

 	void infokomp(){
		cout<< "dysk ma pojemnosc  " << dysk<< endl;
		cout << "pamiec ram wynosci " << ram << endl;
		if (karta)
			karta->wyswietlinfo();
		procesor.infoprocesor();
	}

        Komputer (const Komputer &o) {
		#ifdef TESTPR
			cout << "Dziala konstruktor kopiujacy Komputer()" << endl;
		#endif

		producent=o.producent;
		wykonawca=o.wykonawca;
		procesor=o.procesor;
		dysk=o.dysk;
		cout << "konstruktor kopiujacy sie wywolal " <<  endl;
		cout << "pojemnosc dysku komputera wynosi " << dysk << endl;

   	 }

        ~Komputer () {
                --licznik;
		#ifdef TESTPR
			cout << "Dziala desturktor ~Komputer()" << endl;
		#endif

    	}

        bool operator==(const Komputer &k){ return producent == k.producent; }

		void setProducent(string producent){ this->producent = producent; }

        Komputer& operator=(const Komputer &p){
		cout << "operator przypisania" << endl;
		dysk=p.dysk;
		ram=p.ram;
		return *this;
        }

        Komputer& operator+(Komputer &m){
		cout << "operator + " << endl;
		Komputer temp;
		temp.x = x+m.x;
		temp.y = y+m.y;
		return temp;
        }
};

Teraz klasa Karta jako obiekt dynamiczny

Kopiuj
#include <iostream>
using namespace std;
class Karta
{
    private:
        string nazwa;
        int pamiec;
    public:
        Karta() :nazwa("Nvidia"),pamiec(2000){
        			//cout << "Karta "  << endl;
        			#ifdef TESTPR
				cout << "Dziala konstruktor dynamiczny Karta()" << endl;
			#endif
        }
        ~Karta(){
			#ifdef TESTPR
				cout << "Dziala destruktor ~Karta()" << endl;
			#endif
		}
void wyswietlinfo(){
cout << "nazwa karty" << nazwa << endl;
cout << " pamiec karty" << pamiec << endl;
}

};

Program glowny

Kopiuj
#include "komputer.cpp"

using namespace std;

int Komputer::licznik = 0;

int main(){
	//Karta *karta;
	//karta = new Karta();
	
        cout << "Jest " << Komputer::zwrocLicznik() << " komputerow" << endl;
	Komputer k1;
        cout << "Jest " << Komputer::zwrocLicznik() << " komputer" << endl;
	Komputer k2;
        cout << "Sa " << Komputer::zwrocLicznik() << " komputery" << endl;
	Komputer *k3;
        cout << "Jestesmy po deklaracjach/definicjach" << endl;
	k3 = new Komputer();
        cout << "Sa " << Komputer::zwrocLicznik() << " komputery" << endl;
        cout << (k1 == k2) << endl;
        cout << "procesory sa takie same wiec zwrocilo 1" << endl;
	k2.setProducent("Intel");
        cout << (k1.operator==(k2)) << endl;
        cout << "procesory nie sa takie same wiec zwrocilo 0" << endl;
        cout << "Jest " << Komputer::zwrocLicznik() << " komputerow" << endl;
	delete k3;
        cout << "Jest " << Komputer::zwrocLicznik() << " komputerow bo usunelam jeden hah" << endl;
        Komputer k5;
        cout << "Jest " << Komputer::zwrocLicznik() << " komputerow" << endl;

	Komputer k6(k5); // konstruktor kopiujacy
	Komputer k7;
	Komputer k8;
	k7 = k8;
	k7=k2+k1;
	k2.dodajkarta();
	k2.usunkarta();
	k1.infokomp();


	return 0;

}

klasa procesor

Kopiuj
#include <iostream>
#include <cstring>
using namespace std;

class Procesor{
	private:
		string marka;
		int czestotliwosc;
	public:
		Procesor():marka("Radeon"),czestotliwosc(1000){
			#ifdef TESTPR
				cout << "Dziala konstruktor domyslny Procesor()" << endl;
			#endif
		}

		~Procesor(){
			#ifdef TESTPR
				cout << "Dziala destruktor ~Procesor()" << endl;
			#endif
		}
void infoprocesor(){
cout << "marka procesora " << marka << endl;
cout << " czestotliwosc procesora : " << czestotliwosc << endl;
}
};
twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1
Kopiuj
Karta *radeon = new Karta;
Karta drugiRadeon(*radeon);
Karta trzeciRadeon = *radeon;
twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1
Kopiuj
Komputer(const Komputer& o) {
    ...
    if (o.karta != NULL)
            karta = new Karta(*o.karta);
    ...
}
Kopiuj
Komputer& operator=(const Komputer& p){
    ...
    if (p.karta != NULL) {
         if (karta == NULL) karta = new Karta;
         *karta = *p.karta;
    }
    ...
}
MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

a mam jeszcze pytanie jak to przetestowac w programie glownym zeby byl dowod ze wartosci sie skopiowaly albo przypisaly :) ? jak wlaczam program to wychodzi mi segmentation fault ;/

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
0

Segmentation fault było z powodu próby kopiowania karty, która jeszcze nie została utworzona (jest NULLem). Poprawiona wersja powinna być ok.
Co do testowania to po stworzeniu komputera stwórz kartę, nadaj jej jakiejś wartości. Potem jak tworzysz nowy komputer za pomocą konstruktora kopiującego to wyświetl wartości karty tego nowego komputera.

MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

znowu jest segmentation fault prosze o pomoc nie wiem dlaczego nie dziala ;/

MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0
Kopiuj
  #include <iostream>
#include <cstdio>
#include <cstring>
#include "procesor.cpp"
#include "Karta.cpp"
using namespace std;
typedef int TypDanychT;
class Komputer{
	private:
        	string wykonawca;
		string producent;
		Procesor procesor;
		static int licznik;
        	int dysk;
        	Karta *karta;
        	int ram;


    public:
        friend ostream& operator<< (ostream&,Komputer const&);
        Komputer(int x, int y){
        	this->x = x; this-> y = y;
        }
        static int zwrocLicznik() { return licznik; }
        int  x,y;
        Komputer () {
		karta = NULL;

		//cout << "konstruktor" << endl;
		x=3;
		y=5;
		dysk=500;
		ram=2000;
		++licznik;
		#ifdef TESTPR
			cout << "Dziala konstruktor domyslny Komputer()" << endl;
		#endif
        }
void dodajkarta() {
		if( karta==NULL)
		 	karta= new Karta();
		cout << "dodana karta" << endl;
 	}

	void usunkarta() {
		if(karta)
			delete karta;
		cout << "usunieto karta"<< endl;
	}

 	void infokomp(){
		cout<< "dysk ma pojemnosc  " << dysk<< endl;
		cout << "pamiec ram wynosci " << ram << endl;
		if (karta)
			karta->wyswietlinfo();
		procesor.infoprocesor();
	}

        Komputer (const Komputer &o) {
		#ifdef TESTPR
			cout << "Dziala konstruktor kopiujacy Komputer()" << endl;
		#endif

		producent=o.producent;
		wykonawca=o.wykonawca;
		procesor=o.procesor;
		dysk=o.dysk;
		if (o.karta != NULL)
            karta = new Karta(*o.karta);
		cout << "konstruktor kopiujacy sie wywolal " <<  endl;
		cout << "pojemnosc dysku komputera wynosi " << dysk << endl;

   	 }

        ~Komputer () {
                --licznik;
		#ifdef TESTPR
			cout << "Dziala desturktor ~Komputer()" << endl;
		#endif

    	}

        bool operator==(const Komputer &k){ return producent == k.producent; }

		void setProducent(string producent){ this->producent = producent; }

        Komputer& operator=(const Komputer &p){
		cout << "operator przypisania" << endl;
		dysk=p.dysk;
		ram=p.ram;
		 if (p.karta != NULL)
            {
         if (karta == NULL) karta = new Karta;
         *karta = *p.karta;
            }
		return *this;
        }

        Komputer& operator+(Komputer &m){
		cout << "operator + " << endl;
		Komputer temp;
		temp.x = x+m.x;
		temp.y = y+m.y;
		return temp;
        }



};
 
MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0
Kopiuj
 
#include "komputer.cpp"


using namespace std;

int Komputer::licznik = 0;

int main(){
	//Karta *karta;
	//karta = new Karta();
	
        cout << "Jest " << Komputer::zwrocLicznik() << " komputerow" << endl;
	Komputer k1;
        cout << "Jest " << Komputer::zwrocLicznik() << " komputer" << endl;
	Komputer k2;
        cout << "Sa " << Komputer::zwrocLicznik() << " komputery" << endl;
	Komputer *k3;
        cout << "Jestesmy po deklaracjach/definicjach" << endl;
	k3 = new Komputer();
        cout << "Sa " << Komputer::zwrocLicznik() << " komputery" << endl;
        cout << (k1 == k2) << endl;
        cout << "procesory sa takie same wiec zwrocilo 1" << endl;
	k2.setProducent("Intel");
        cout << (k1.operator==(k2)) << endl;
        cout << "procesory nie sa takie same wiec zwrocilo 0" << endl;
        cout << "Jest " << Komputer::zwrocLicznik() << " komputerow" << endl;
	delete k3;
        cout << "Jest " << Komputer::zwrocLicznik() << " komputerow bo usunelam jeden hah" << endl;
        Komputer k5;
        cout << "Jest " << Komputer::zwrocLicznik() << " komputerow" << endl;

	Komputer k6(k5); // konstruktor kopiujacy
	Komputer k7;
	Komputer k8;
	k7 = k8;
	k7=k2+k1;
	k2.dodajkarta();
	k2.usunkarta();
	k1.infokomp();


	return 0;

}
twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
0

Masz zły operator+

Kopiuj
Komputer& operator+(Komputer &m) {
    Komputer temp;
    ...
    return temp;
}

Zwracasz referencję do zmiennej tymczasowej. Zmień na:

Kopiuj
Komputer operator+(const Komputer& m) {

Aczkolwiek to chyba nie jest powód do SIGSEGVa: http://ideone.com/TJQkC4.
Jeśli oczekujesz dalszej pomocy to:

  1. Sformatuj kod, np. na http://format.krzaq.cc, albo korzystaj z kodu, który @kq pokazał w komentarzu
  2. Wklej cały kod na http://ideone.com tak by się kompilowało i pokaż nam, że rzeczywiście jest SIGSEGV
MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0
Kopiuj
#include <iostream>
#include <cstring>
using namespace std;
class Procesor {
private:
    string marka;
    int czestotliwosc;

public:
    Procesor()
        : marka("Radeon")
        , czestotliwosc(1000)
    {
#ifdef TESTPR
        cout << "Dziala konstruktor domyslny Procesor()" << endl;
#endif
    }

    ~Procesor()
    {
#ifdef TESTPR
        cout << "Dziala destruktor ~Procesor()" << endl;
#endif
    }
    void infoprocesor()
    {
        cout << "marka procesora " << marka << endl;
        cout << " czestotliwosc procesora : " << czestotliwosc << endl;
    }
};


#include <iostream>
//#include "Karta.h"
using namespace std;
class Karta {
private:
    string nazwa;
    int pamiec;

public:
    Karta()
        : nazwa("Nvidia")
        , pamiec(2000)
    {
//cout << "Karta "  << endl;
#ifdef TESTPR
        cout << "Dziala konstruktor dynamiczny Karta()" << endl;
#endif
    }
    ~Karta()
    {
#ifdef TESTPR
        cout << "Dziala destruktor ~Karta()" << endl;
#endif
    }
    void wyswietlinfo()
    {
        cout << "nazwa karty" << nazwa << endl;
        cout << " pamiec karty" << pamiec << endl;
    }
};



#include <iostream>
#include <cstdio>
#include <cstring>
#include "procesor.cpp"
#include "Karta.cpp"
using namespace std;
typedef int TypDanychT;
class Komputer {
private:
    string wykonawca;
    string producent;
    Procesor procesor;
    static int licznik;
    int dysk;
    Karta* karta;
    int ram;

public:
    friend ostream& operator<<(ostream&, Komputer const&);
    Komputer(int x, int y)
    {
        this->x = x;
        this->y = y;
    }
    static int zwrocLicznik() { return licznik; }
    int x, y;
    Komputer()
    {
        karta = NULL;

        //cout << "konstruktor" << endl;
        x = 3;
        y = 5;
        dysk = 500;
        ram = 2000;
        ++licznik;
#ifdef TESTPR
        cout << "Dziala konstruktor domyslny Komputer()" << endl;
#endif
    }

    void dodajkarta()
    {
        if (karta == NULL)
            karta = new Karta();
        cout << "dodana karta" << endl;
    }

    void usunkarta()
    {
        if (karta)
            delete karta;
        cout << "usunieto karta" << endl;
    }

    void infokomp()
    {
        cout << "dysk ma pojemnosc  " << dysk << endl;
        cout << "pamiec ram wynosci " << ram << endl;
        if (karta)
            karta->wyswietlinfo();
        procesor.infoprocesor();
    }

    Komputer(const Komputer& o)
    {
#ifdef TESTPR
        cout << "Dziala konstruktor kopiujacy Komputer()" << endl;
#endif

        producent = o.producent;
        wykonawca = o.wykonawca;
        procesor = o.procesor;
        dysk = o.dysk;
        //if (o.karta != NULL)
        //karta = new Karta(*o.karta);
        cout << "konstruktor kopiujacy sie wywolal " << endl;
        cout << "pojemnosc dysku komputera wynosi " << dysk << endl;
    }

    ~Komputer()
    {
        --licznik;
#ifdef TESTPR
        cout << "Dziala desturktor ~Komputer()" << endl;
#endif
    }

    bool operator==(const Komputer& k) { return producent == k.producent; }

    void setProducent(string producent) { this->producent = producent; }

    Komputer& operator=(const Komputer& p)
    {
        cout << "operator przypisania" << endl;
        dysk = p.dysk;
        ram = p.ram;
        /* if (p.karta != NULL)
            {
         if (karta == NULL) karta = new Karta;
         *karta = *p.karta;
            }*/
        return *this;
    }

    Komputer operator+(Komputer& m)
    {
        cout << "operator + " << endl;
        Komputer temp;
        temp.x = x + m.x;
        temp.y = y + m.y;
        return temp;
    }
    //        void przypisania::operator = (przypisania &b)

    //ostream& operator<< (ostream &wyjscie, Komputer const& ex)
    // {
    //    wyjscie << "Pierwsza liczba: " << ex.pierwsza << " oraz druga: " << ex.druga << endl;
    //return wyjscie;
    // }
};




#include "komputer.cpp"

using namespace std;

int Komputer::licznik = 0;

int main()
{
    //Karta *karta;
    //karta = new Karta();

    cout << "Jest " << Komputer::zwrocLicznik() << " komputerow" << endl;
    Komputer k1;
    cout << "Jest " << Komputer::zwrocLicznik() << " komputer" << endl;
    Komputer k2;
    cout << "Sa " << Komputer::zwrocLicznik() << " komputery" << endl;
    Komputer* k3;
    cout << "Jestesmy po deklaracjach/definicjach" << endl;
    k3 = new Komputer();
    cout << "Sa " << Komputer::zwrocLicznik() << " komputery" << endl;
    cout << (k1 == k2) << endl;
    cout << "procesory sa takie same wiec zwrocilo 1" << endl;
    k2.setProducent("Intel");
    cout << (k1.operator==(k2)) << endl;
    cout << "procesory nie sa takie same wiec zwrocilo 0" << endl;
    cout << "Jest " << Komputer::zwrocLicznik() << " komputerow" << endl;
    delete k3;
    cout << "Jest " << Komputer::zwrocLicznik() << " komputerow bo usunelam jeden hah" << endl;
    Komputer k5;
    cout << "Jest " << Komputer::zwrocLicznik() << " komputerow" << endl;

    Komputer k6(k5); // konstruktor kopiujacy
    Komputer k7;
    Komputer k8;
    k7 = k8;
    k7 = k2 + k1;
    k2.dodajkarta();
    k2.usunkarta();
    k1.infokomp();

    return 0;
} 

Nie wiem jak go dodac na ta stronke co wyslales do kompilowania bo wyskakuja bledy przy kompilacji a jak u siebie sprawdzam to jest ok bo wzielam w komentarzu konstruktor kopiujacy i operator przypisania czy teraz pomozesz prosze :)
http://ideone.com/z5yqUy

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
0
michalukwerka napisał(a):

Nie wiem jak go dodac na ta stronke co wyslales do kompilowania bo wyskakuja bledy przy kompilacji a jak u siebie sprawdzam to jest ok bo wzielam w komentarzu konstruktor kopiujacy i operator przypisania czy teraz pomozesz prosze :)

Trzeba było wybrać język C++, a nie Java na tej stronie.
Jak mam pomóc jak pokazałem kod z moimi poprawkami, który się nie wysypuje, a Ty nie pokazujesz mi kodu który się wysypuje.

MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

http://ideone.com/L4XkRi
Przepraszam tutaj dodalam w c++

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1

@michalukwerka kompilator mówił, żeby wywalić includey, bo przecież tam nie masz tych plików. Wywaliłem za Ciebie, odkomentowałem mój kod i NIE widzę żadnego segmentation fault: http://ideone.com/3FTSu9

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.