4 votes

Comment peut-on accéder à la valeur d'une variable de classe à l'aide de l'adresse de la classe et d'un décalage vers la variable?

J'ai besoin d'accéder à une valeur de variable de classe strictement privée d'une classe en utilisant son instance et un décalage vers la variable.

Jusqu'à présent, j'ai essayé ceci, vérifiez cet exemple de classe

type
  TFoo=class
   strict private class var Foo: Integer;
   public
   constructor Create;
  end;

constructor TFoo.Create;
begin
  inherited;
  Foo:=666;
end;

// cette fonction fonctionne uniquement si je déclare la variable foo comme
// strict private var Foo: Integer;
function GetFooValue(const AClass: TFoo): Integer;
begin
  Result := PInteger(PByte(AClass) + 4)^
end;

Comme vous pouvez le voir, la fonction GetFooValue ne fonctionne que lorsque la variable foo n'est pas déclarée comme une variable de classe.

La question est comment dois-je modifier la GetFooValue pour obtenir la valeur de Foo lorsqu'elle est déclarée comme strict private class var Foo: Integer;

7voto

LU RD Points 13180

Pour accéder à une variable de classe strictement privée, Class Helper pour aider.

Exemple :

type
  TFoo = class
  strict private class var
    Foo : Integer;
  end;

  TFooHelper = class helper for TFoo
  private
    function GetFooValue : Integer;
  public
    property FooValue : Integer read GetFooValue;
  end;

function TFooHelper.GetFooValue : Integer;
begin
  Result:= Self.Foo;  // Accéder à la classe org avec Self
end;

function GetFooValue( F : TFoo) : Integer;
begin
  Result:= F.GetFooValue;
end;

Var f : TFoo;//ne pas besoin d'instancier car nous n'accédons qu'aux méthodes de classe

begin
  WriteLn(GetFooValue(f));
  ReadLn;
end.

Exemple mis à jour pour correspondre à la question.

2voto

Mason Wheeler Points 52022

Vous ne pouvez vraiment pas le faire de cette façon. Une variable de classe est implémentée comme une variable globale, et son emplacement en mémoire n'a aucune relation prévisible avec l'emplacement du VMT de la classe (à quoi la référence de classe pointe), qui se trouve dans la région des données constantes de la mémoire de votre processus.

Si vous avez besoin d'accéder à cette variable depuis l'extérieur de la classe, déclarez une propriété de classe qui y fait référence en tant que champ de support.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X