Witam. Mam problem z działaniem pewnego programu w C++. Dopiero uczę się programowania obiektowego (właściwie to w tej chwili uczę się samych jego podstaw) i mam pewien problem, z którym sobie nie potrafię poradzić. Otóż mam podane dwie klasy: TString
(zawierająca tablicę *char
, zmienną int
mówiącą o długości tablicy i metodę print()
, drukującą ten string na ekranie konsoli) oraz Kolor
(zmienne R, G i B,
pole nazwa
typu TString
i metodę print()
, wypisującą zawartość tej klasy na ekranie). Stworzenie konstruktorów, metody i destruktora dla TString
nie było większym problemem i wszystko z tego co wiem działa jak należy, problem pojawia się przy konstruktorach dla klasy Kolor
.
Otóż, jednym z poleceń jest napisanie konstruktora z parametrem TString
. Zgodnie z logiką przypisuję jego wartość do pola nazwa
i normalnie z niego korzystam. Problemów nie ma, metoda print()
wypisuje całą zawartość klasy Kolor
łącznie z polem typu TString
i wszystko jest ok. Problem zaczyna się wtedy, gdy dochodzi do uruchamiania się destruktorów jeden po drugim - w pewnym momencie program próbuje usunąć o jedną klasę za dużo... ale najpierw dam kod, żeby było wiadomo o co chodzi. Pominę wszystkie include i using namespace std, szkoda się z tym powtarzać.
// PLIK TString.h
class TString
{
private:
int len;
char *str;
public:
inline void print()
{
for (int i=0;i<len;i++)
cout<<*(str+i);
cout<<endl;
}
TString();
TString(char *ArgS);
TString(char *ArgS, int ArgI);
~TString();
};
// PLIK TString.cpp
TString::TString()
{
cout<<"Konstruktor bezargumentowy TString"<<endl;
len=0;
str=0;
}
TString::TString(char *String)
{
cout<<"Konstruktor z argumentem char* TString"<<endl;
len=strlen(String);
str=new char[len];
for (int i=0;i<len;i++)
*(str+i)=*(String+i); //strcpy(str,String);
}
TString::TString(char *String, int Dlug)
{
cout<<"Konstruktor z dwoma argumentami char* i int TString"<<endl;
len=Dlug;
str=new char[len];
for (int i=0;i<len;i++)
*(str+i)=*(String+i);
}
TString::~TString()
{
cout<<"Destruktor TString"<<endl;
if (str)
delete []str;
}
// PLIK Kolor.h
class Kolor
{
private:
int R,G,B;
TString nazwa;
public:
inline void print()
{
cout<<"R: "<<R<<endl;
cout<<"G: "<<G<<endl;
cout<<"B: "<<B<<endl;
cout<<"Nazwa: ";
nazwa.print();
}
Kolor();
Kolor(TString *ArgT);
~Kolor();
};
// PLIK Kolor.cpp
Kolor::Kolor()
{
cout << "Konstruktor bezargumentowy Kolor" << endl;
R=G=B=0;
}
Kolor::Kolor(TString *ArgT)
{
cout << "Konstruktor z jednym argumentem TString Kolor" << endl;
R=3; G=5; B=88;
nazwa=*ArgT;
}
Kolor::~Kolor()
{
cout << "Destruktor Kolor" << endl;
//nazwa.~TString();
}
// PLIK main.cpp
int _tmain(int argc, _TCHAR* argv[])
{
TString firstname("Imie");
firstname.print();
TString lastname("Nazwisko");
lastname.print();
Kolor COSTAM(&firstname);
COSTAM.print();
return 0;
}
To co się dzieje rozumiem tak: polu nazwa
w klasie Kolor
przypisany zostaje firstname
. Problem w tym, że teraz obie nazwy wskazują na jedną klasę, więc przy próbie uruchomienia drugiego destruktora program wykrzacza się (bo nie ma już czego usunąć). Problem leży w tym, że kompletnie nie mam pojęcia, w jaki sposób napisać to tak, żeby program działał. Jesteście w stanie wytknąć mi wszystkie możliwe błędy w kodzie (przede wszystkim ten, który uniemożliwia mi zakończenie tego programu bez wykrzaczenia się)? Byłbym bardzo wdzięczny.