Witold napisał(a):Kinio dodałeś kostruktor TGlowna::TGlowna(AnsiString __path) i do rzutowania nie trzeba operatora dla AnsiString’a. (gdyby był byłaby chyba niejednoznaczność). "plik1.txt" nie jest typu AnsiString . A TGlowna("plik1.txt") też chyba można traktować jako rzutowanie (styl c funkcyjny tak jak int i = int(7.2))
Więc tak, po pierwsze trzeba sobie uświadomić czym się różni konwersja od rzutowania: rzutowanie jest jawną próbą zmiany typu, natomiast konwersja zachodzi automatycznie. Czyli rzutowanie jest wymuszoną konwersją.
Mając np.:
- Kod: Zaznacz cały
int a = 12;
double d = 13.2;
double e = d+a;
najprawdopodobniej w ostatniej linijce nastąpi niejawne rzutowanie (konwersja) na typu int na typ double. Jednak my możemy chcieć czegoś innego: aby w zmiennej e była przechowywana wartość całkowita działania ale jako typ double wtedy trzeba wykonać rzutowanie:
- Kod: Zaznacz cały
double e = (int)(d+a)
jednak zaraz po naszym rzutowaniu nastąpi konwersja na typ double, ale już z typu int więc e będzie równe 25.
Tak więc na tę drobnostkę którą znalazłeś mogę dopowiedzieć że aby rzutować, czyli użyć jawnie operatora rzutowania trzeba go zdefiniować w klasie AnsiString w sposób jaki pokazałem wcześniej, ponieważ dla klasy TGlowna raczej nie będzie go domyślnie zdefiniowanego:
- Kod: Zaznacz cały
AnsiString operator TGlowna(void);
Dodatkowo to że dodałem konstruktor kopiujący: TGlowna::TGlowna(AnsiString __path) nie eliminuje konieczności definicji operatora rzutowania. Jak słusznie zauważyłeś "plik1.txt" nie jest typu AnsiString tylko typu char* a mimo wszystko istnieje możliwość zapisu:
- Kod: Zaznacz cały
AnsiString a = "cos tam";
Ten zapis jest możliwy dzięki temu że gdzieś w klasie AnsiString jest zdefiniowany konstruktor typu: AnsiString(char*).
Tak więc podobny zapis z użyciem klasy TGlowna:
- Kod: Zaznacz cały
TGlowna a[] = {"plik1.txt", "plik2.txt"};
nie będzie możliwy i podczas kompilacji pojawią się błędy ponieważ tutaj kompilator budując drzewo syntaktyczne musiałby zastosować dwie konwersje:
1. typu char* na AnsiString pewnie przy pomocy konstruktora
2. typu AnsiString na TGlowna też przy pomocy konstruktora
Jednak nie jest on tak inteligentny i nie potrafi tego zrobić ponieważ gdyby umiał zrobić dwie konwersje, wtedy powinien też umieć zrobić trzy i więcej. Jednak jeżeli nie było by możliwości konwersji jednego typu na drugi wtedy nasz biedny kompilator próbowałby dopasowywać konstruktory, operaotry rzutowania wszystkich znanych mu aktualnie typów w nieskończoność a i tak by nie znalazł odpowiedniej konwersji. Tak więc możliwa jest tylko jedna konwersja np. w przypadku kiedy mamy odpowiedni konstruktor.
Wobec powyższego zapis:
- Kod: Zaznacz cały
TGlowna a[] = {TGlowna("plik1.txt"), TGlowna("plik2.txt")};
jest konieczny do takiej inicjalizacji tablicy ponieważ zapis:
- Kod: Zaznacz cały
TGlowna a[] = {"plik1.txt", "plik2.txt"};
nie będzie poprawny z powodu opisanego wcześniej. Natomiast zapisy:
- Kod: Zaznacz cały
TGlowna a[] = {(TGlowna)"plik1.txt", (TGlowna)"plik2.txt"};
TGlowna a[] = {TGlowna("plik1.txt"), TGlowna("plik2.txt")};
są obydwa poprawne i tutaj masz rację jeżeli w klasie AnsiString będzie zdefiniowany operator rzutowania oraz w klasie TGlowna konstruktor TGlowna(AnsiString) to wystąpi niejednoznaczność.
Czyli może tak na podsumowanie pierwszej drobnostki:
- o rzutowaniu mówimy jeżeli wykonujemy je przy pomocy operatora rzutowania, który mamy gdzieś zdefiniowany
- raczej nie powinniśmy mówić o rzutowaniu w przypadku kiedy uruchamiany jest konstrutkor
- zapis: TGlowna a = TGlowna("plik"); oraz TGlowna a = (TGlowna)"plik"; będą możliwe obydwa równocześnie przy definicji albo operatora w klasie AnsiString albo konstruktora w klasie TGlowna.
- Definicja operatora operator TGlowna w klasie AnsiString oraz konstruktora TGlowna(AnsiString) nie jest możliwa ze względu na wystąpienie niejednoznaczności!
Co do drugiej drobnostki:
Witold napisał(a):Sprawdziłem - brak wywołań konstruktora kopiującego, wiec chyba niema obiektów tymczasowych.
Tak masz racje, nie ma tam mowy o obiektach chwilowych - aż z ciekawości sprawdziłem
Pozdrawiam!



TGlowna

