W takim razie Result skoro jest zmienną to czy nazwa funkcji też nią jest i czy różnią się jedynie nazwą ??
To raczej jest kwestia interpretacji kodu przez kombilator;
Co do samego problemu - jeżeli zastosuję Twoją propozyjce, czyli list obiektów, a nie listę wskaźników na obiekty, to muszę je później usuwać w destruktorze klasy zawierającej ową listę ??
Oczywiście że tak, jeśli nie chcesz generować wycieków pamięci; Zasada jest prosta - to co alokujesz, na koniec dealokuj; Jeżeli tworzysz obiekty dynamicznie, to trzeba je w jakimś momencie zwolnić z pamięci (najlepiej w momencie gdy nie są już potrzebne, a nie sztywno przy zamykaniu aplikacji); Pamiętaj, że FPC nie posiada śmieciarki, więc ze zwalniania dynamicznie alokowanej pamięci nikt ani nic Cię nie wyręczy (i dobrze);
Dodatkowo, czy poprawnym jest powołanie obiektu, zwracanie wskaźnika na ten obiekt, a potem wyłuskanie tego obiektu spod wskaźnika i dodanie go np. do listy czy tablicy ?
Ale masz w tym jakiś szczególny cel, czy po prostu tak chcesz zrobić, bo tak było w C++? Zauważ, że te dwa języki wiele różni, więc raczej nie brałbym przykładu z C++, pisząc w Pascalu, Obiect Pascalu czy Delphi;
Sprawa jest prosta - dostęp do utworzonej instancji klasy w pamięci uzyskujesz przez niejawny wskaźnik, więc to powinno Ci wystarczyć; Zawsze jednak są wyjątki - nawet w źródłach biblioteki standardowej dla FPC można znaleźć wskaźniki na wskaźniki na wskaźniki - nie dociekałem po co to;
Czy raczej od razu zwracać obiekt i go dodawać do listy ?
Jeśli nie pracujesz nad jakimś turbo WTFem, to wystarczy trzymać to, co niejawnie zwraca konstruktor klasy;
W mojej bibliotece do obsługi plików TreeStructInfo korzystam z klasy przechowującej obiekty elementów drzew; Typ TTSInfoElementsList jest to w skrócie zwykła macierz typu array of TObject
, gdzie każdy element listy zajmuje SizeOf(TObject)
bajtów (na moim systemie 4 bajty
); Nie ma żadnego sensu w tworzeniu wskaźników na te elementy list, skoro one same w sobie są wskaźnikami na zaalokowaną pamięć dla obiektów;
W takim przypadku w destruktorze wystarczy zwalniać pamięć po elementach list, czyli wywołując metody Free
, bez innych zabaw; Jeżeli trzymałbyś wskaźniki na miejsca, do których przekazywano utworzone obiekty, to wskaźników nie musiałbyś zwalniać (to zrobi automat), ale to co znajduje się pod wskaźnikami już tak;
[...] i tak teraz przerabiam już 4 raz mój program [...]
I nie martwi Cię to, że już czwarty raz podchodzisz do tego samego algorytmu? Ja rozumiem, że w parktyce wszystko wychodzi najlepiej, ale dobrze by było się najpierw zastanowić nad kodem, a dopiero później zacząć klepać; A tak to robisz jeden krok do przodu, a następnie cztery do tyłu;
Z reguły projektując, przy okazji rysując diagramy w WhiteStarUML, albo zbyt wiele czasu poświęcałem, na przemyślenie wszystkiego, albo podczas imolementacji okazywało sie, że to jest kiepskie i trzeba przeprojektować.
To raczej normalne, że coś się projektuje, a następnie w praktyce trzeba stosować nieco obejść i implementować po części niezgodnie z projektem; Tym raczej się nie przejmuj i nie twórz diagramów zbyt skrupulatnie, bo stracisz tylko czas; Diagramy mają pomagać w stworzeniu programu, a nie być jego wierną graficzną reprezentacją;
Niemniej, chyba faktycznie zastosuje w tym meiejscu rekord zamiast obiektu.
Jeżeli masz dużą pewność, że obiekty nie będą konieczne w późniejszych etapach, np. w końcowym stadiom implementacji lub w już procesie utrzymywania kodu, to śmiało możesz skorzystać z rekordów; Jednak korzystanie z klas wcale nie jest nie wiadomo jak trudniejsze czy wolniejsze w porównaniu do rekordów, więc raczej nic nie stracisz, jeśli od razu zajmiesz się klasami; Wręcz przeciwnie - więcej możesz zyskać niż stracić;
Z drugiej strony - czy mogę tworzyć recordy, tak jak obiekty i je zwracać z funkcji ?
Zależy co masz na myśli;
Tworzyć rekordy i zwracać je w funkcji oczywiście możesz, nie tylko jako wskaźniki, ale także jako całe struktury; Możesz zwrócić za pomocą funkcji pointer na rekord, np. wspomnianego typu PName
, albo cały rekord typu TName
; Natomiast w przypadku obiektów takiego wyboru już nie masz - zwracasz referencję do zaalokowanej pamięci dla obiektu, czyli niejawny wskaźnik;
Jak bardzo Cię to interesuje to możesz nawet zwracać blok pamięci jaki okupuje utworzony obiekt, ale to raczej w ramach ćwiczeń czy zaspokojenia ciekawości, a nie jako warta stosowania technika.