Klasa Zespolone - podstawy

0

Witam.
Mam takie sobie zadanko:
Liczby zespolone składają się z części rezczywistej i urojonej opisanych przez zmienne typu double. Napisz klasę cplx implementujaca:
-prywatne pola obu liczb, dwuparametrowy konstruktor, funkcję dodawania(add(cplx)), funkcję odejmowania (sub(cplx*)), mnożenia (mul(Cplx&)), funkcję zwiększającą część rzeczywistą o jeden (inc()), funkcję show wyświetlającą daną liczbę zespoloną w formacie 4 + 4i. Działanie zdefiniowanej klasy przedstaw na przykładach przynajmniej trzech różnych liczb.

Przeciąż operator ++ w ciele klasy Cplx tak, aby wykonanie operacji obj++; skutkowało zwiększeniem części rzeczywistej o jeden.

Przeciąż operator + w ciele klasy Cplx tak, aby wykonanie obj1+obj2; zsymowało liczby zespolone obj1 i obj2

Przeciąż operator - poza ciałem klasy Cplx tak, aby wykonanie operacji obj1-obj2 odjęło liczby

Przeciąż operator < tak, aby wyświetlał liczbę zespoloną w formacie 4 + 5i. Wyrzystaj objekt klasy ostream.

Przygotuj klasę Osoba z prywatnymi polami char* imie, char* nazwisko, Osoba** dzieci i int wiek. Zadbaj, aby def tej klasy była całkowicie samowystarczalna i hermetyczna. Przedefiniuj wszystkie domyślnie tworzone elementy tej klasy. Zaimplementuj operacje: -zwiększenia wieku o 1 przez operator ++, -zmiany, dodania lub odsunięcia dowolnej litery przez operatory - i +.

I oto kod który mam na to zadanie. Jednak nie działa od do końca dobrze gdyż bo ponieważ przy " void opertator+(){..." wyświetla mi błąd "variable or field 'opertator' declared void" i nie mam pomysł o co może chodzić:

A oto kod na to zadanie:

 
#include <cstdlib>
#include <iostream>
using namespace std;

class Cplx{
    double rz;
    double u;
    public:
    Cplx(double rz, double u){
        this->rz=rz;
        this->u=u;
    }
    void add(Cplx l){
        rz+=l.rz;
        u+=l.u;
    }
    void sub(Cplx* l){
        rz-=l->rz;
        u-=l->u;
    }
    void mul(Cplx& l){
        rz=(rz*l.rz)-(u-l.u);
        u=(u*l.rz)+(rz+l.u);
    }
    void inc(){
        rz+=1;
    }
    void show(){
        if(rz!=0);
        cout<<rz;
        if(u>0)
        cout<<"+"<<u<<"i"<<endl;
        else if(u<0)
        cout<<u<<"i"<<endl;
          }
        //ZAD 2
    void operator ++(){
        rz++;
    }
        //ZAD 3
    Cplx operator+ (Cplx& l){
        return Cplx((rz+l.rz),(u+l.u));  
    }
    friend Cplx operator-(Cplx& l, Cplx& l1);
    friend ostream& operator<<(ostream& str, Cplx& l);
};
    Cplx operator-(Cplx& l, Cplx& l1){
         return Cplx((l.rz-l1.rz),(l.u-l1.u));
    }
    ostream& operator<<(ostream& str, Cplx& l){
        if(l.rz!=0);
            str<<l.rz;
        if(l.u>0)
            str<<"+"<<l.u<<"i"<<endl;
        else if(l.u<0)
            str<<l.u<<"i"<<endl;
    return str;
    }
     
class Osoba{
    char* imie;
    char* nazwisko;
    int wiek;
    Osoba* dzieci;
public:
    Osoba(){
    	char input[100];
        cout << "podaj imie: ";
        cin >> input;
        imie = new char[ strlen(input) + 1];
        memcpy( imie, input, strlen(input) + 1);
        cout << "podaj nazwisko: ";
        cin >> input;
    	nazwisko = new char[ strlen(input) + 1];
        memcpy( nazwisko, input, strlen(input) + 1);
    	cout << "podaj wiek: ";
        cin >> wiek;
    }
    Osoba(char* imie, char* nazwisko, int wiek, Osoba* dzieci){
        this->imie = new char[ strlen(imie) + 1];
        memcpy( this->imie, imie, strlen(imie) + 1);
        this->nazwisko = new char[ strlen(nazwisko) + 1];
        memcpy( this->nazwisko, nazwisko, strlen(nazwisko) + 1);
    	this->wiek=wiek;
        }
    Osoba(Osoba &o){
        this->imie = new char[ strlen(o.imie) + 1];
        memcpy( this->imie, o.imie, strlen(o.imie) + 1);
        this->nazwisko = new char[ strlen(o.nazwisko) + 1];
        memcpy( this->nazwisko, o.nazwisko, strlen(o.nazwisko) + 1);
        addDzieci(o.dzieci);
        wiek=o.wiek;
    }
    Osoba(Osoba *o){
        this->imie = new char[ strlen(o->imie) + 1];
        memcpy( this->imie, o->imie, strlen(o->imie) + 1);
    	this->nazwisko = new char[ strlen(o->nazwisko) + 1];
        memcpy( this->nazwisko, o->nazwisko, strlen(o->nazwisko) + 1);
        addDzieci(o->dzieci);
        wiek=o->wiek;
    }
    void addDzieci(Osoba* dz){
        int counter=0;
    	while(dz!=null){
        	counter++;
        }
        dzieci=new (*Osoba)[counter];
    	for(int i=0;i<counter;i++){
            dzieci[i]=dz[i];
        }
    }
    ~Osoba(){
        delete[] imie;
        delete[] nazwisko;
    	int a =0;
        while(dzieci != null){
        	delete dzieci[a];
            a++;
        }
	}
    void opertator+(){
    	wiek++;
    }
    void operator-(char pattern){
        char* copy=new char[strlen(imie)+1];;
        for(int i=0;i<strlen(imie);i++)
            if(imie[i]!=pattern){
            	copy[i]=imie[i];
        	}
            imie=new char(strlen(copy));
            strcpy(imie,copy);
    }
	void operator +(char pattern){
        int counter=0;
        char*copy=imie;
        while(imie!=NULL)
            counter++;
            imie=new char[strlen(imie)+2];
        	strcpy(imie,copy);
            imie[counter-1]=pattern;
        }
        bool operator==(Osoba& o){
        	if(o.wiek == wiek && o.nazwisko == nazwisko && o.imie==imie){
            	int c=0;
            	while(dzieci != null){
                	c++;
            	}
        		int c1=0;
            	while(o.dzieci != null){
            	c1++;
            	}
            	if(c==c1){
                	int a=0;
                	while(dzieci != null){
                		if(dzieci[a] == o.dzieci[a])
                		a++;
                		else return false;
                	}      
                	return true;
            	}else return false;
        	}else return false;
        }
    bool operator==(Osoba* o){
        if(wiek == o->wiek && nazwisko == o->nazwisko && imie==o->imie){
        	int c=0;
            while(dzieci != null){
            	c++;
            }
            int c1=0;
            while(o->dzieci != null){
                c1++;
            }
            if(c==c1){
                int a=0;
                while(dzieci != null){
                	if(dzieci[a] == o->dzieci[a])
                    a++;
                    else return false;
                }      
            	return true;
            }else return false;
        }else return false;
    }
};

int main(int argc, char *argv[]){
        Cplx l=Cplx(10,3);
        cout<<l;
}
0

Zrób dziedziczenie z klasy complex do swojej klasy: class MyComlex : public std::complex<typ> później tylko dopisz lub przesłoń właściwe funkcje. Zaoszczędzisz trochę kodu.

0
  1. Musisz zwrócić jakiś typ jak sam błąd wskazuje. Nie może być to void. Bo po co przeciążać operator, jeśli funkcja nie miałaby nic zwracać - zamień to na nazwę klasy, czy jaki tam potrzebujesz typ.
  2. Przeciążyłeś operator pre-inkrementacji (++obj), a zadanie mówi o operatorze post-inkremenracji. Żeby użyć obj++; musisz użyć przeciążenia w takiej formule
typ operator++(int)
0

Jeśli chodzi o kod dotyczący liczb zespolonych to już wszystko jest OK :)

Jeszcze tylko cześć kodu odpowiedzialna za ostatni podpunkt zadania klasa Osoba:
Poniżej oddzielny kod tego zadania:

 #include <iostream>
#include <string.h>
#include <cstdlib>
using namespace std;

class Osoba{
    char* imie;
    char* nazwisko;
    int wiek;
    Osoba* dzieci;
public:
    Osoba(){
    	char input[100];
        cout << "Podaj imie: ";
        cin >> input;
        imie = new char[ strlen(input) + 1];
        memcpy( imie, input, strlen(input) + 1);
        cout << "Podaj nazwisko: ";
        cin >> input;
    	nazwisko = new char[ strlen(input) + 1];
        memcpy( nazwisko, input, strlen(input) + 1);
    	cout << "Podaj wiek: ";
        cin >> wiek;
    }
    Osoba(char* imie, char* nazwisko, int wiek, Osoba* dzieci){
        this->imie = new char[ strlen(imie) + 1];
        memcpy( this->imie, imie, strlen(imie) + 1);
        this->nazwisko = new char[ strlen(nazwisko) + 1];
        memcpy( this->nazwisko, nazwisko, strlen(nazwisko) + 1);
    	this->wiek=wiek;
        }
    Osoba(Osoba &o){
        this->imie = new char[ strlen(o.imie) + 1];
        memcpy( this->imie, o.imie, strlen(o.imie) + 1);
        this->nazwisko = new char[ strlen(o.nazwisko) + 1];
        memcpy( this->nazwisko, o.nazwisko, strlen(o.nazwisko) + 1);
        addDzieci(o.dzieci);
        wiek=o.wiek;
    }
    Osoba(Osoba *o){
        this->imie = new char[ strlen(o->imie) + 1];
        memcpy( this->imie, o->imie, strlen(o->imie) + 1);
    	this->nazwisko = new char[ strlen(o->nazwisko) + 1];
        memcpy( this->nazwisko, o->nazwisko, strlen(o->nazwisko) + 1);
        addDzieci(o->dzieci);
        wiek=o->wiek;
    }
    void addDzieci(Osoba* dz){
        int counter=0;
    	while(dz!=0){
        	counter++;
        }
        dzieci=new (*Osoba)[counter];
    	for(int i=0;i<counter;i++){
            dzieci[i]=dz[i];
        }
    }
    ~Osoba(){
        delete[] imie;
        delete[] nazwisko;
    	int a =0;
        while(dzieci != null){
        	delete dzieci[a];
            a++;
        }
	}
    void opertator(){
    	wiek++;
    }
    void operator-(char pattern){
        char* copy=new char[strlen(imie)+1];;
        for(int i=0;i<strlen(imie);i++)
            if(imie[i]!=pattern){
            	copy[i]=imie[i];
        	}
            imie=new char(strlen(copy));
            strcpy(imie,copy);
    }
	void operator +(char pattern){
        int counter=0;
        char*copy=imie;
        while(imie!=NULL)
            counter++;
            imie=new char[strlen(imie)+2];
        	strcpy(imie,copy);
            imie[counter-1]=pattern;
        }
        bool operator==(Osoba& o){
        	if(o.wiek == wiek && o.nazwisko == nazwisko && o.imie==imie){
            	int c=0;
            	while(dzieci != null){
                	c++;
            	}
        		int c1=0;
            	while(o.dzieci != null){
            	c1++;
            	}
            	if(c==c1){
                	int a=0;
                	while(dzieci != null){
                		if(dzieci[a] == o.dzieci[a])
                		a++;
                		else return false;
                	}      
                	return true;
            	}else return false;
        	}else return false;
        }
    bool operator==(Osoba* o){
        if(wiek == o->wiek && nazwisko == o->nazwisko && imie==o->imie){
        	int c=0;
            while(dzieci != null){
            	c++;
            }
            int c1=0;
            while(o->dzieci != null){
                c1++;
            }
            if(c==c1){
                int a=0;
                while(dzieci != null){
                	if(dzieci[a] == o->dzieci[a])
                    a++;
                    else return false;
                }      
            	return true;
            }else return false;
        }else return false;
    }
};

int main(int argc, char *argv[]) {
	return 0;
}

Wywala mi błąd w tym miejscu

dzieci=new (*Osoba)[counter];
    	for(int i=0;i<counter;i++){
            dzieci[i]=dz[i];
        } 

Jakieś propozycje naprawienia tego?

1

Rozumiem ,że chcesz utworzyć tablicę wskaźników na osoby. W takim razie powinno być Osoba ** dzieci.
następnie:
dzieci = new (osoba*)[counter]

0

A sprawdzałeś czy po zrobieniu w ten sposób kompiluję się? Bo mi nie chce przejść :/

0

Sorry :) Już wszystko działa dzięki wielkie :D

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