Dit yndlings programmeringssprog

Tags:    programmering

Som overskriften siger, vil jeg gerne have gang i en debat om hvilket sprog du foretrækker, og hvorfor? Har det noget at gøre med de værktøjer, der er tilgængelig (f.eks. skulle Visual Studio-IDE'et være populært blandt C# udviklere), eller på grund af den programmeringsstil, der understøttes? Det være sig objektorienteret programmering, eller funktionel programmering.

Personligt kan jeg godt lide C++, men det er også det eneste rigtige programmeringssprog, jeg har arbejdet med. Jeg har planer om at lære mig selv Common Lisp, da jeg godt kan li' princippet omkring REPL.

Skyd løs, og lad os få en seriøs debat.



Specielt anvendeligt for AI og Renderings komponenter i et spil!



Så vidt jeg forstår på hvad du ønsker, taler du om det, der i C++-lingo kaldes "pointers to members". Det understøttes (selvom syntaksen er lidt grim). Faciliteterne beskrives i §15.5 i The C++ Programming Language - er det dem du mener?



Er vi enige om at for at for at kalde en normal funktion i en class skal man have både en pointer til funktionen og et objeckt? Jeg går ud fra at det er det samme i Delphi, Java, C# og ...
Har man både funktion og objekt er der ingen problem at kalde funktioner på tværs af class'er i C++.
Med static funktioner behøver man ingen objeter, da funktionen er delt mellem alle instanser af class'en.



Jeg tror at Troels har ramt plet!

Bertel>> Jeg ved ikke med Java og C# men i Delphi behøver du ikke to pointers, èn er nok!

Eksempel:

type

TTestA = Class
public
function MemberFunctionA() : Integer; //Returnere 5
end;

TTestB = Class
public
function MemberFunctionB() : Integer; //Returere 10
end;

Pnt = PointerToMemberFunction() of object; //Typed Pointer

var
P : Pnt;
I : Integer;
begin

//Klasse A
TestA := TTestA.Create();
P := @TestA.MemberFunctionA();
I := P(); //Varianten I er nu 5
TestA.Free;

//Klasse B
TestB := TTestB.Create();
P := @TestB.MemberFunctionB();
P(); //Varianten I er nu 10
TestB.Free;

end;

Har ikke lige kompilet eksemplet, men således foregår det i Delphi - ret simpelt ikk?! Pnt kunne selvfølgelig også ha' fungeret som en member af begge klasser!



I C++ ville man være nødt til at have både en pointer til class'en og en til funktionen, det skyldes at en pointer er en adresse og intet andet i C++.
Om det andet er smart ved jeg ikke, jeg tror aldrig jeg har haft brug for det.



En pointer i Delphi er også kun èn adresse (1 jump) - rent faktisk er det bare en integer! I Delphi er klasser en skabelon til et objekt og kan derfor sammenlignes lidt med en pointer til et objekt. I C++ er klasser rent faktisk det som man i Delphi ville kalde for objekter - altså en record/struct der tillader funktioner. Prøv eksempelvis at udskifte en syntaksen "class" med syntaksen "struct" i C++! Der vil ikke være nogen forskel bortset fra at struct som default bruger "public" members, hvor class bruger "private" members som default! Der er tilgengænd andre store fordele ved at bruge objekter i stedet for klasser! Men jeg tror at vi er ved at bevæge os i en off-topic diskussion :-).



Hvis P i dit eksempel kun er en adresse, hvordan kan den så runtime vide hvilken funktion den skal OG for hvilket objekt den skal kalde?



Dette kode er gennem testet!

... snip ...

type

TTestA = class
public
function MemberFunctionA : Integer; //Returnere 5
end;


TTestB = class
public
function MemberFunctionB : Integer; //Returere 10
end;

Pnt = function : Integer of object; //Typed Pointer

... snip ...

og selve implementationen!

... snip ...

function TTestA.MemberFunctionA : Integer;
begin
Result := 5;
end;

function TTestB.MemberFunctionB : Integer; //Returere 10
begin
Result := 10;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
TestA : TTestA;
TestB : TTestB;
P : Pnt;
I : Integer;
begin

//Klasse A
TestA := TTestA.Create;
P := TestA.MemberFunctionA;
I := P; //Varianten I er nu 5
TestA.Free;

//Klasse B
TestB := TTestB.Create;
P := TestB.MemberFunctionB;
I := P; //Varianten I er nu 10
TestB.Free;

end;

... Jeg må indrømme at jeg ikke har haft held til at konventere en typed pointer, Pnt, til en integer for dernæst at konventere den tilbage til en typed pointer. Du har muligvis ret i at der rent faktisk gemmer sig to pointers (integers) i den typed pointer: Pnt! Men det ændre vel ikke meget på den dynamsike implementering man kan implementere! Troels nævnte tidligere at han mente at der er en måde at gøre lign eksempel i C++, men at syntakserne ville være lidt grimme. Er det noget du evt. kan vise?



Man kunne kaste sig ud i:

Fold kodeboks ind/udKode 


Tricket er at gå via en static funktion, den behøver egentlig ikke være en member af nogen class.

Den static funcktion bliver kaldt via en "normal" funktions pointer og får pointeren til objektet som parameter, og kalder så den rigtige funktion.



I C++ er klasser rent faktisk det som man i Delphi ville kalde for objekter - altså en record/struct der tillader funktioner.


Du lyder forvirret. I C++ er en klasse også bare en skabelon der bruges til at oprette objekter, og som specificerer handlingerne for objekter af den type som klassen definerer. En klasse kan kun selv noget hvis den har statiske medlemmer. Hvis du vil have sprog hvor klasser i sig selv er objekter, så skal du se på sprog som Smalltalk, Ruby og CLOS, hvor man kan bruge interessante teknikker som at oprette, og ændre, klasser (ikke bare objekter) ved runtime.

Prøv eksempelvis at udskifte en syntaksen "class" med syntaksen "struct" i C++! Der vil ikke være nogen forskel bortset fra at struct som default bruger "public" members, hvor class bruger "private" members som default!


Hvad havde du da forventet? En struct er også bare en skabelon - du kan ikke bare definere en struct-type og så referere til dens medlemmer (med mindre de er static), du skal først oprette et objekt af typen.





t