Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dynamiczna alokacja a konstruktory. (Pomoc w zadaniu)

Ostatnio zmodyfikowano 2021-05-04 23:22
Autor Wiadomość
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.
P-178545
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
C/C++
Wielobok X( ile );
polygons[ i ] = X;
możesz zrobić na przykład
C/C++
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.
P-178546
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?
P-178547
DejaVu
» 2021-05-04 23:01:23
Jest wiele możliwości rozwiązania tego samego problemu. Kwestia preferencji i doświadczenia.
P-178548
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..
C/C++
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.
P-178549
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?
P-178550
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.
P-178551
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.
P-178552
1 « 2 »
Poprzednia strona Strona 2 z 2