Witam,
Na zajęciach z C++ miałem do napisania zadania, które umieściłem w załączniku. Na mój program otrzymałem następującą informacje zwrotną:
- W jaki sposób przypisujemy napisy?
- Zad 6. niepełne -1.0
- Zad 2. brak konstruktora kopiującego -0.3 a inne implementacja pozostałych pozostawia wiele do życzenia
- Zad 4. Operatory dodawania mają dobrą składnie, ale zapewniają pisanie po nieprzydzielonej pamięci -0.3
Czy ktoś potrafi wytłumaczyć mi głownie pkt 4 jak poprawnie należałoby zrobić podane konstruktory oraz pkt 5.
Kod mojego programu:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//deklaracja klasy
class Napis{
char *wsktab;
public:
int dltablicy(char *);
void wypisz();
Napis();
Napis(char *);
Napis(char);
bool operator<(Napis);
bool operator>(Napis);
bool operator==(Napis);
bool operator!=(Napis);
bool operator<(char *);
bool operator>(char *);
bool operator==(char *);
bool operator!=(char *);
char* operator+(Napis);
char* operator+(char *);
char* operator+(char );
};
int Napis::dltablicy(char *tab){
return strlen(tab);
}
void Napis::wypisz(){
cout << "Elementy tablicy to: " << endl;
int rozmiar = dltablicy(wsktab);
for (int i = 0; i < rozmiar; i++){
cout << *wsktab;
wsktab++;
}
}
//KONSTRUKTOR INICJALIZUJACY NAPISEM
Napis::Napis(char *tab){
int rozmiar = dltablicy(tab);
wsktab = new char[rozmiar];
strcpy(wsktab, tab);
}
//KONSTRUKTOR INICJALIZUJACY ZNAKIEM
Napis::Napis(char a){
wsktab = new char[2];
wsktab[0] = a;
wsktab[1] = '\0';
strcpy(Napis::wsktab, wsktab);
}
//PRZECIAZENIE OPERATROA dla obiektu klasy
bool Napis::operator<(Napis a){
if (dltablicy(wsktab) < dltablicy(a.wsktab))
return true;
else
return false;
}
bool Napis::operator>(Napis a){
if (dltablicy(wsktab) > dltablicy(a.wsktab))
return true;
else
return false;
}
bool Napis::operator==(Napis a){
if (dltablicy(wsktab) == dltablicy(a.wsktab))
return true;
else
return false;
}
bool Napis::operator!=(Napis a){
if (dltablicy(wsktab) != dltablicy(a.wsktab))
return true;
else
return false;
}
//PRZECIAZENIE OPERATORW DLA TYABVLICY ZNAKOW
bool Napis::operator<(char *tab){
if (dltablicy(wsktab) < strlen(tab))
return true;
else
return false;
}
bool Napis::operator>(char *tab){
if (dltablicy(wsktab) > strlen(tab))
return true;
else
return false;
}
bool Napis::operator==(char *tab){
if (dltablicy(wsktab) == strlen(tab))
return true;
else
return false;
}
bool Napis::operator!=(char *tab){
if (dltablicy(wsktab) != strlen(tab))
return true;
else
return false;
}
//PRZELADOWANIA Z LACZENIEM TABLIC ITD.
char* Napis::operator+(Napis a){
return strcat(wsktab, a.wsktab);
}
char* Napis::operator+(char *a){
return strcat(wsktab, a);
}
char* Napis::operator+(char a){
wsktab = new char[2];
wsktab[0] = a;
wsktab[1] = '\0';
strcat(Napis::wsktab, wsktab);
}
void main(){
char b = 'a';
Napis tekst("TEKST NAPISU");// napisem
Napis tekst2(b); // znakiem
Napis przyklad(tekst); //istniejacym obietem
Napis tekst3; //domyslnym konstruktorem
tekst.wypisz();
cout << endl;
tekst2.wypisz();
cout << endl;
przyklad.wypisz();
cout << endl;
tekst3.wypisz();
//SPRAWDZANIE OPERATORA TEST
if (tekst < tekst2)
cout << "Ale beka jest mniejsze niz a";
else
cout << "a jest mniejsze njiz ale beka";
//TEST LACZENIA OPERATOR +
cout << tekst+tekst << endl;
getchar();
}