http://ideone.com/m9npA2
No co tu źle jest i jak to poprawić?
jawne wywołanie konstruktora
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2500
anonymous23456 napisał(a):
http://ideone.com/m9npA2
No co tu źle jest i jak to poprawić?
Konstruktor jest wywołany podczas tworzenia obiektu. Tutaj obiekt a już istnieje (już został utworzony), więc jaki sens ma wywołanie konstruktora?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
Konstruktor jawnie może być wywoływany za pomocą 'placement new': http://en.wikipedia.org/wiki/Placement_syntax
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
a co jeśli moj operator >> robi dokladnie to samo, co konstruktor?
To wywołuj operator >> z konstruktora :P
Albo, nieco bardziej na poważnie: zrób kolejną funkcję, tym razem prywatną i wywołuj ją zarówno z konstruktora jak i operatora >>.
- Rejestracja: dni
- Ostatnio: dni
@Wibowit : no dobra, ale to brzydkie, nie da się inaczej? I dlaczego? Przecież konstruktor to tylko funkcja, nie tworzy obiektu i bez listy inicjalizacyjnej nie ma nic z tworzeniem wspolnego, podobnie jak destruktor z usuwaniem obiektu.
- Rejestracja: dni
- Ostatnio: dni
no dobra, ale to brzydkie, nie da się inaczej? I dlaczego?
Ale inaczej co? Co chcesz osiągnąć? Bo twój kod jest bez sensu.
Przecież konstruktor to tylko funkcja, nie tworzy obiektu i bez listy inicjalizacyjnej nie ma nic z tworzeniem wspolnego, podobnie jak destruktor z usuwaniem obiektu.
Konstruktor i destruktor to nie są normalne funkcje.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
Jeśli jest brzydkie to opakuj w funkcję lub zrób makro preprocesora. Ewentualnie może jakiś szablon jeśli się da.
Podałem ci dużo opcji do wyboru. Na pytanie "dlaczego?" nie jestem w stanie rzetelnie odpowiedzieć. Musisz zapytać kolesi, którzy kontrolują język C++.
A najlepiej odstaw C++ i zjedz Snickersa :P
- Rejestracja: dni
- Ostatnio: dni
Nie rozumiem waszej wrogości. Naprawde nigdy nie pisaliście kodu, w którym konstruktor robi prawie to samo, co operator >> ? I dlaczego nie mogę wywołać tak konstruktora, skoro destruktora mogę?
http://ideone.com/V8A0OZ
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2500
anonymous23456 napisał(a):
Nie rozumiem waszej wrogości.
A gdzie widzisz tę wrogość? To, że ktoś mówi, że Twój kod jest bez sensu, to żadna wrogość (co innego gdyby powiedział, że Ty jesteś bez sensu, jakokolwiek bez sensu to by nie brzmiało).
I dlaczego nie mogę wywołać tak konstruktora, skoro destruktora mogę?
http://ideone.com/V8A0OZ
Bo konstruktor jest wywołany gdy nie ma jeszcze obiektu, a destruktor gdy ten obiekt już żyje i się opala na plaży.
Niemniej nie powinieneś wywołać destruktora w ten sposób. Jeśli obiekt został stworzony na stosie, to nic nie zyskasz a jedynie mącisz kod, bo obiekt i tak zostanie zniszczony i destruktor wywołany gdy obiekt wyjdzie z zakresu. Natomiast jeśli został stworzony na stercie, to niszczysz obiekt nie zwalniając pamięci, czyli masz wyciek pamięci. Prawie nigdy nie powinieneś wywołać destruktora ręcznie (są wyjątki, np. gdy chcesz tylko zniszczyć obiekt ale nie chcesz zwolnić pamięci).
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
Nie rozumiem waszej wrogości.
Jakiej wrogości?
Naprawde nigdy nie pisaliście kodu, w którym konstruktor robi prawie to samo, co operator >> ?
Gdybym tak miał to bym wydzielił osobną funkcję i ją odpowiednio nazwał. To co chcesz zrobić wprowadzi tylko zamieszanie.
I dlaczego nie mogę wywołać tak konstruktora, skoro destruktora mogę?
http://ideone.com/V8A0OZ
Bo tak twórcy języka zadecydowali i już. Pytania do nich. Masz za to placement new, który jest 100% odpowiednikiem i dalej marudzisz.
ps:
za długo pisałem i poprzednik mnie ubiegł ;p
- Rejestracja: dni
- Ostatnio: dni
konstruktor wywołujesz za pomocą new kiedy tworzysz obiekt na stercie, albo wywołuje się „sam” kiedy umieszczasz obiekt na stosie, albo wywołujesz go za pomocą placement new tworząc obiekt w przygotowanym uprzednio miejscu.
nie ma potrzeby wymyślania składni dla „jawnego wywołania konstruktora”, bo powyższe obejmują wszystkie możliwe przypadki.