http://ideone.com/m9npA2
No co tu źle jest i jak to poprawić?
a co mówi compile error?
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?
Konstruktor jawnie może być wywoływany za pomocą 'placement new': http://en.wikipedia.org/wiki/Placement_syntax
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 >>.
@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.
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.
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
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
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).
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
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.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.