Klasy, destruktory i konstruktory tworzenie

0

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ą:

  1. W jaki sposób przypisujemy napisy?
  2. Zad 6. niepełne -1.0
  3. Zad 2. brak konstruktora kopiującego -0.3 a inne implementacja pozostałych pozostawia wiele do życzenia
  4. 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();


} 
1

Nie wiem jak ci to bardziej wytłumaczyć, sprawdź w słowniku słowo brak, bo co to jest konstruktor kopiujący powinieneś wiedzieć.
Czy wiesz że napis: char napis[]="napis"; zajmuje 6 znaków zaś strlen() zwraca 5 znaków.

0

W pkt 4 chodziło mi bardziej o stwierdzenie "inne pozostawiają wiele do życzenia" o te życzenia pytam :).
A pkt 5 już rozumiem. Dziękuję.

0

Drugi wiersz postu opisuje drugą część zdania.

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