Static Classe in Classe

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6914
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Static Classe in Classe

Beitrag von Mathias »

In Java sieht dies so aus:

Code: Alles auswählen

class C {
	private int zahl;
 
	public C(int z) {
		zahl = z;
	}
 
	public int getZahl() {
		return zahl;
	}
}
 
class Test {
	static public C c = new C(123); // Classe ist statisch
 
	static public int[] i = { 1, 2, 3, 4 };
}
Gibt es dafür in FPC auch eine Lösung ?

Code: Alles auswählen

  TC = class
  private
    Zahl: integer;
  public
    constructor Create(z: integer);
  end;
 
 
  Ttest = class
  const
    i: array[0..3] of integer = (1, 2, 3, 4);
    C: TC = TC.Create(123); // ist static, gibt Fehler
  end;    
Nur dies gibt ein Kompiler-Fehler, wie erwartet.
Nur, kann ich dies nicht in den Constructor nehmen, da die Classe statisch ist und nur 1mal mit Create initialisiert werden darf.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Static Classe in Classe

Beitrag von Socke »

Code: Alles auswählen

unit myunit;
interface
type
  TC = class
  private
    Zahl: integer;
  public
    constructor Create(z: integer);
  end;
  Ttest = class
  const
    C: TC;
  end;
implementation
// ...
initialization
  TTest.C := TC.Create(123);
finalization
  TTest.C.Free;
end. 
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Mathias
Beiträge: 6914
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Static Classe in Classe

Beitrag von Mathias »

Ich dachte, es gäbe eine elegante Lösung innerhalb der Classe.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Static Classe in Classe

Beitrag von Socke »

Mathias hat geschrieben:Ich dachte, es gäbe eine elegante Lösung innerhalb der Classe.
Du kannst eine Klassenmethode definieren, die alle Klassenvariablen initialisiert. Diese rufst du im initialization-Block auf. (Aufräumen nicht vergessen).

Eleganter gehts in Pascal nicht.
Wobei man jetzt darüber streiten kann, ob hier Java oder Pascal eleganter ist :D
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Mathias
Beiträge: 6914
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Static Classe in Classe

Beitrag von Mathias »

Ich bin eigentlich kein Freund von Java, aber das hier finde ich in Java besser gelöst.

Irgendwie leuchtet es mir jetzt ein, das dies in Pascal nicht geht, wie will man die Classe bei Programmende aufräumen. :wink:
Da man in Java nicht aufräumen muss, geht dies natürlich.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Static Classe in Classe

Beitrag von marcov »

Delphi Classes sind typisch Referenzen, und nicht automatisch allokieert.Delphi (und FPC) garantieren daneben nichts über die Inhalt von Classe Speicher, in andere Worte: der Kompiler darf Felde usw her-arrangieren wenn es sein muss. (zb fuer Performance) Eine harter Classe-struct Äquivalenz wie bei C++ (und Java?) gibst nicht.

Man kann für speziale Falle auch statisch instantiieren, aber das ist nicht einfach. Früher nutzte das DOM von die XML classes dieser Prinzip um Classen in Massen zu instantieren. Es ist aber nicht gemeint für normaler Nutzung.

Kurzer Zusammengefasst: nutze Records mit methoden.

Code: Alles auswählen

{$mode delphi}
type
TC = class
  private
    Zahl: integer;
  public
    constructor Create(z: integer);
  end;
 
constructor tc.create;
begin
  zahl:=z;
end;
 
const  cachedinstancesize = 8;  // wert von tc.instancesize;
 
var staticroom: array[0..cachedinstancesize-1] of byte;
    i:integer;
begin
  fillchar(staticroom,cachedinstancesize,#0); // Null Initialisierung is verpflichtet.
  ppointer(@staticroom)^:=TC;                      // VMT ref
  tc(@staticroom).create(65535);                   // instance.create stat classtype.create! Static constructor.
  for i:=0 to cachedinstancesize-1 do
    write(staticroom[i], ' ');
  writeln;
end.

Antworten