Parametry funkcji - obiekty klas

0

Witam.

Proszę o wytłumaczenie jak to jest, że stworzony obiekt przekazywany do funkcji nie jako referencja (parametr funkcji bez var) jest przekazywany jako oryginał a nie kopia.
W przy standardowych zmiennych funkcja pracuje na kopii zmiennej a tu na oryginale....

Klasa jest standardowa jak poniżej - dziedzicząca z TRownanie

 
TRownanie = class
 private
  IloscDzialan:Integer;
  MaxWynik:Integer;
  Liczba1: array of Integer;
  Liczba2: array of Integer;
  Liczba3: array of Integer;
  Operator:String;
 protected

 public
   constructor Create(IloscDzialan_:Integer); virtual;
   destructor Destroy; 
   procedure GenerujLiczby(Min:Integer;Max:Integer);virtual;abstract;
   function PokazRownanie(Index:Integer):String;virtual;abstract;
   function ObliczWynik(Index:Integer):Currency;virtual;abstract;
 published

 end;


TDzielenie = class(TRownanie)
 private

 protected

 public
   constructor Create(IloscDzialan_:Integer;MaxWynik_:Integer); virtual;
   destructor Destroy;
   procedure GenerujLiczby(Min:Integer;Max:Integer);
   function PokazRownanie(Index:Integer):String;
   function ObliczWynik(Index:Integer):Currency;override; 
 end;

Deklaracja i tworzenie obiektu:

 
Dzielenie:TDzielenie;

..... i funkcja która pracuje na oryginale (parametr nie będący referencją bez var)

 
function Sprawdz(Rownanie:TRownanie;Index:Integer):Boolean; //funkcja poliformiczna

///////////////////////////////////////////////////////////////////////////////////////////
function TForm1.Sprawdz(Rownanie:TRownanie;Index:Integer):Boolean; //funkcja polimorficzna  z argumentem typu statycznego obiektu - pracujemy na kopii obiektu
begin
  if StrToInt(EWynik.Text)=Rownanie.ObliczWynik(Index) then
  begin
    Form1.PanelInfo.Caption:='DOBRZE';
    REHistoria.SelAttributes.Color:=clGreen;
    REHistoria.Lines.Add(LRownanie.Caption+EWynik.Text);
    result:=True;
  end else
  begin
    Form1.PanelInfo.Caption:='ŹLE - prawidłowy wynik to: '+CurrToStr(Rownanie.ObliczWynik(Index));
    REHistoria.SelAttributes.Color:=clRed;
    REHistoria.Lines.Add(LRownanie.Caption+EWynik.Text);
    result:=False;
  end;
end;
0

Zmienne "obiektowe" w Delphi są de facto wskaźnikami, dlatego możesz do nich przypisać Nil; W ten sposób nie przekażesz kopii obiektu, a wskaźnik do niego, więc funkcja będzie pracować na oryginale.

0

Zachowanie takie jak się wydaje pytaczowi posiadają obiekty, (tj. słowo kluczowe object). Klasy to wskaźniki na obiekty (w gruncie rzeczy).

0

Obiekty oraz tablice alokowane dynamiczne, precyzując.

0

Proszę o wytłumaczenie jak to jest, że stworzony obiekt przekazywany do funkcji nie jako referencja (parametr funkcji bez var) jest przekazywany jako oryginał a nie kopia.
Najprostsza odpowiedź brzmi: bo tak. Regułka do zapamiętania: w Delphi obiekty typu class są przekazywane jako referencje.

0

Bardzo chętnie się dowiem kto i za jakie domniemane grzechy zminusował mi post. Chętnie dowiem się cóż to osoby które nie wiedzą jak działają ansistringi wiedzą o mechanice języka...

Obiekty oraz tablice alokowane dynamiczne, precyzując.

Cytuj bo nie wiadomo co precyzujesz.

0

Ja minusa nie dałem, choć też miałem zamiar. Mylisz się co do słowa kluczowego object.

Proszę bardzo, pokaż mi to. Chętnie dowiem się czegoś nowego.

0

po kilkukrotnym przeczytaniu twojego posta dochodzę do wniosku, że dobrze wiesz, ale niezrozumiale to sformułowałeś.
różnica między class a object jest przede wszystkim taka, że obiekt typu class jest przekazywany jako wskaźnik, a obiekt typu object jako wartość - chyba że jawnie użyjemy wskaźników.

object pochodzi z Turbo Pascala. w Delphi zastąpione przez class. tego pierwszego słowa się już praktycznie nie używa.

ponadto nowsze wersje Delphi pozwalają na definiowanie metod wewnątrz rekordów, zacierając różnicę między object a record.

0

różnica między class a object jest przede wszystkim taka, że obiekt typu class jest przekazywany jako wskaźnik, a obiekt typu object jako wartość - chyba że jawnie użyjemy wskaźników.

Tak, o to mi chodziło? Czy jest inne znaczenie mojego posta? A może po prostu większość osób źle czyta to co ja piszę poprawnie? Chętnie dowiem się cóż takiego zrozumiałeś....

w Delphi zastąpione przez class

No właśnie nie zastąpione, ale rozwinięte. Bo object wciąż istnieje, nie wiem czy w kompilatorach Delphi, ale w FPC jest...

ponadto nowsze wersje Delphi pozwalają na definiowanie metod wewnątrz rekordów, zacierając różnicę między object a record.

FPC też wspiera advanced records...

0

Ehm - nie wiem jak 2.7.1, ale FPC 2.6.2 nie obsługuje jeszcze konstruktorów oraz destruktorów adv.records, tak btw. ;P

Nie wiem, aż tak się tym nie interesuje, jedyne co robiłem, to operator który jest żeby generyki działały. Jak już to stosuję object... I właśnie jedynie po to one zostały dodane - żeby operatory działały. Bo ludzie myślący nie potrzebują takich udziwnień...
Tak czy siak, nie zmienia to faktu że adv.records jest wspierane... Bodaj od niedawna, więc pewno jeszcze kiedyś dorzucą resztę...

0

Tak, o to mi chodziło? Czy jest inne znaczenie mojego posta? A może po prostu większość osób źle czyta to co ja piszę poprawnie? Chętnie dowiem się cóż takiego zrozumiałeś....
Bujaj się.

0
Azarien napisał(a):

Tak, o to mi chodziło? Czy jest inne znaczenie mojego posta? A może po prostu większość osób źle czyta to co ja piszę poprawnie? Chętnie dowiem się cóż takiego zrozumiałeś....
Bujaj się.

:D

Czyżby rzeczywiście okazało się że po prostu nie umiesz czytać? Bo ja jestem otwarty na nieścisłości w moim poście, jeżeli dopuszczalne jest zrozumienie go inaczej, to oczywiście nie ma problemu, to mój błąd. Natomiast wydaje mi się że jest jeden sposób na zrozumienie jego i niestety sposób ten okazał się dla ciebie nieosiągalny i jesteś nieuprzejmy ponieważ po prostu nie umiesz przeczytać prostego posta... Ale jak zwykle jestem otwarty na alternatywne myślenie które jednak musi być poprawne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1