Dynamiczna alokacja a konstruktory. (Pomoc w zadaniu)
Ostatnio zmodyfikowano 2021-05-04 23:22
deBe. Temat założony przez niniejszego użytkownika |
» 2021-05-04 22:42:16 Problem polega na tym, iż nie mogę użyć ani kontenerów ani przeciążania operatorów, tak mówiła profesorka. |
|
pekfos |
» 2021-05-04 22:44:11 Nie musisz używać operatora przypisania, żeby uzyskać tą funkcjonalność. Wystarczy zwykła metoda, tylko musisz jej potem używać zamiast operatora przypisania. Więc zamiast Wielobok X( ile ); polygons[ i ] = X; możesz zrobić na przykład polygons[ i ].utworz( ile );
Te std::swap() w sortowaniu też trzeba by jeszcze przerobić na wywołanie metody na wielokącie. Możesz użyć std::swap() w środku do zamiany pól między obiektami. |
|
deBe. Temat założony przez niniejszego użytkownika |
» 2021-05-04 22:51:32 Jeszcze jedno pytanko, mianowicie, czy mogę wywołać określony konstruktor przyjmujący jakąś wartość dynamicznie alokując pamięć na tablice obiektów Wielobok? Chodzi mi o tą linię kodu Wielobok * polygons = new Wielobok[ n ]; Gdzie mam wstawić parametr który przyjmuje konstruktor? |
|
DejaVu |
» 2021-05-04 23:01:23 Jest wiele możliwości rozwiązania tego samego problemu. Kwestia preferencji i doświadczenia. |
|
pekfos |
» 2021-05-04 23:09:36 To są propozycje jakie mamy patrząc na obecny kod. Może dotarłeś do ślepego zaułka pisząc coś innego od siebie, a może faktycznie wymagania są błędne. Nie da się tu teraz stwierdzić jaki kod jest dany do zadania. Jeśli żadny, to nie napisałeś że konstruktor wielokąta ma przyjmować parametr - równie dobrze możesz pytać użytkownika o wartość w konstruktorze domyślnym. Wyjścia na ten moment to głównie haki. Mając obiekt możesz go niby utworzyć ponownie.. Wielobok w;
w.~Wielobok(); new( & w ) Wielobok( 3 ); Póki nie spróbujesz tak zniszczyć obiektu więcej niż raz pod rząd, powinno być OK. https://en.cppreference.com/w/cpp/language/new, szukaj "placement new". To jest te rozwiązanie żeby ręcznie tworzyć obiekty w zaalokowanej wcześniej pamięci. Najlepiej zadbać o odpowiednie wyrównanie pamięci pod obiekty, inaczej możesz mieć dziwne akcje pod różnymi architekturami. Przykład wyżej używa pamięci z istniejącego obiektu danego typu, więc w założeniu ma dobry adres. |
|
deBe. Temat założony przez niniejszego użytkownika |
» 2021-05-04 23:11:33 Jeszcze jedno pytanko, mianowicie, czy mogę wywołać określony konstruktor przyjmujący jakąś wartość dynamicznie alokując pamięć na tablice obiektów Wielobok? Chodzi mi o tą linię kodu Wielobok * polygons = new Wielobok[ n ]; Gdzie mam wstawić parametr który przyjmuje konstruktor? Czy może w ten sposób alokując pamięć mogę jedynie wywołać konstruktor bezparametrowy? |
|
pekfos |
» 2021-05-04 23:19:53 Wywoływane są domyślne konstruktory w takim zapisie. Żeby parametryzować każdy obiekt z osobna musisz najpierw zaalokować samą pamięć i potem w pętli tworzyć obiekty z użyciem placement new (przeczytaj uwagę powyżej na ten temat). Idealnie, nie powinieneś tego robić i zamiast tego powinieneś użyć kontenera który to opakowuje. Ręczne zarządzanie pamięcią jest w złym stylu i należy go unikać gdzie się da. |
|
deBe. Temat założony przez niniejszego użytkownika |
» 2021-05-04 23:22:29 Wszystko wiem. Dziękuję pięknie za pomoc. Zamykam temat oraz pozdrawiam gorąco. |
|
1 « 2 » |