2011-12-27 3 views
2

i travailler avec la surcharge de l'opérateur, et j'ai cette situation, fra un côté:F2047 unité circulaire référence

unit _TIns; 

interface 

uses 
    _TExtract; 

type 
    TIns = record 
    private type 
    TInsArray = array [1..90] of Boolean; 
    var 
    FInsArray: TInsArray; 
    public 
    class operator Implicit(const Value: TExtract): TIns; 
    class operator Implicit(const Value: TIns): TExtract; 
    end; 

implementation 
    // Code 
end. 

et, de l'autre côté:

unit _TExtract; 

interface 

uses 
    _TIns; 

type 
    TExtract = record 
    private type 
    TExtractEnum = 1 .. 90; 
    var 
    FExtractEnum: TExtractEnum; 
    public 
    class operator Implicit(const Value: Integer): TExtract; 
    class operator Implicit(const Value: TExtract): Integer; 
    class operator In(A: TExtract; B: TIns) : Boolean; 
    end; 

implementation 
    // Code 
end. 

Bien sûr, je l'ai compris où est le problème, et c'est que l'unité appelle l'autre. Mais pas compris comme le résoudre. Si j'essaie de le définir dans la même unité, le premier TExtract ne trouve pas de TIns, ou sinon TIns ne trouve pas TExtract. Je peux supprimer la dépendance et la résoudre, seulement si n'existe pas la solution, mais j'utiliserais ce type de données pour les deux. Merci beaucoup pour votre aide et bonne année à tous.

+0

cela peut aider [stackoverflow] [1] [1]: http: // stackoverflow. com/questions/1284959/comment-éviter-circulaire-unité-référence – PresleyDias

Répondre

5

Vous avez deux problèmes de référence circulaire. Premièrement, vous déclarez deux unités qui se réfèrent chacune à l'autre dans la section interface. Cela peut être résolu de diverses façons. Pour l'instant Pour l'instant je vais ignorer ce problème et me concentrer sur l'autre problème de référence circulaire. Pour ce faire, je vais supposer que tout le code apparaît dans la même unité.

Le problème de référence circulaire le plus pressant est que TIns fait référence à TExtract et vice versa. Afin de casser cette circularité particulière, vous devrez introduire une référence vers l'avant, comme cela est couramment fait avec les classes. Mais il s'avère que les références avant ne peuvent pas être faites pour les types record.

Alors que les références avant sont possibles pour les types de classe, il existe une différence fondamentale entre les types de classe et les types d'enregistrement. Les types d'enregistrement sont des types de valeur et les types de classe sont des types de référence. L'implémentation actuelle du compilateur Delphi ne prend pas en charge les références directes pour les types de valeur.

La solution à votre problème consiste à déplacer les opérateurs qui se réfèrent aux deux types à l'un des enregistrements déclarés en dernier. Par exemple:

TIns = record 
private type 
    TInsArray = array [1..90] of Boolean; 
var 
    FInsArray: TInsArray; 
end; 

TExtract = record 
private type 
    TExtractEnum = 1 .. 90; 
var 
    FExtractEnum: TExtractEnum; 
public 
    class operator Implicit(const Value: TExtract): TIns; 
    class operator Implicit(const Value: TIns): TExtract; 
    class operator Implicit(const Value: Integer): TExtract; 
    class operator Implicit(const Value: TExtract): Integer; 
    class operator In(A: TExtract; B: TIns) : Boolean; 
end; 

Si vous souhaitez conserver deux unités distinctes font alors comme ceci:

  1. Mettez TIns dans l'unité _TIns.
  2. A faire et non utiliser _TExtract de _TIns.
  3. Mettez TExtract dans l'unité _TExtract.
  4. Utilisez _TIns à partir de la section d'interface de _TExtract.

Comme ceci:

unit _TIns; 

interface 

type 
    TIns = record 
    private type 
    TInsArray = array [1..90] of Boolean; 
    var 
    FInsArray: TInsArray; 
    end; 

implementation 

end. 

 

unit _TExtract; 

interface 

uses 
    _TIns; 

type 
    TExtract = record 
    private type 
    TExtractEnum = 1 .. 90; 
    var 
    FExtractEnum: TExtractEnum; 
    public 
    class operator Implicit(const Value: TExtract): TIns; 
    class operator Implicit(const Value: TIns): TExtract; 
    class operator Implicit(const Value: Integer): TExtract; 
    class operator Implicit(const Value: TExtract): Integer; 
    class operator In(A: TExtract; B: TIns) : Boolean; 
    end; 

implementation 
    // Code 
end. 
+0

Compris, alors je devrais copier le code de _TExtract implémantation dans l'implémentation _TIns pour le résoudre et ne pas appeler _TExtract. D'accord. Merci beaucoup. –

+0

Je me suis souvenu de la solution au problème et je l'ai ajouté à la réponse. –

+0

Le problème est que les deux opérateurs appellent autre. Donc je dois le faire pour les deux sans appeler unité, correct? –