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

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

#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

#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

#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

#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;
}
};
1
Karta *radeon = new Karta;
Karta drugiRadeon(*radeon);
Karta trzeciRadeon = *radeon;
1
Komputer(const Komputer& o) {
    ...
    if (o.karta != NULL)
            karta = new Karta(*o.karta);
    ...
}
Komputer& operator=(const Komputer& p){
    ...
    if (p.karta != NULL) {
         if (karta == NULL) karta = new Karta;
         *karta = *p.karta;
    }
    ...
}
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 ;/

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.

0

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

0
  #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;
        }



};
 
0
 
#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;

}
0

Masz zły operator+

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

Zwracasz referencję do zmiennej tymczasowej. Zmień na:

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
0
#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

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.

0

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

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

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