unit A
interface
uses B
type AClass=class
  protected
    iBClass:BClass;//此处引用B类
end;-------
unit B
interface
uses A
type BClass=class
  protected
    iAClass:AClass;//此处引用A类
end;编译的时候总是出错,怎么解决?都说implementation后面,但是implementation后面的type AClass=class就不好定义了呀。

解决方案 »

  1.   

    用第三个类。
    这个类从CLASSA CLASSB中继承
      

  2.   

    只要其中一类里对另个的引用放到implementation后才行,书上是这么说,
    type AClass=class你可以专门用个unit放记录类型
      

  3.   

    unit UnitC;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;Type
      TAClass = class;  TBClass = class
        A1:TAClass;
        function F2:String ;
      public
        constructor Create();
        destructor Destroy; override;
      end;  TAClass=class
        B1:TBClass;
        function F2:String ;
      public
        constructor Create();
        destructor Destroy; override;
      end;  TForm1 = class(TForm)
      private
      public
      end;var
      Form1: TForm1;implementation
    constructor TAClass.Create();
    begin
      inherited Create;
      //
    end;
    destructor TAClass.Destroy;
    begin
      //
      inherited Destroy;
    end;
    function TAClass.F2:String;
    begin
      result := B1.F2 + 'TAClass';
    end;
    constructor TBClass.Create();
    begin
      inherited Create;
      //
    end;
    destructor TBClass.Destroy;
    begin
      //
      inherited Destroy;
    end;
    function TBClass.F2:String;
    begin
      result := A1.F2 + 'TBClass';
    end;
    {$R *.dfm}end.你自己看看
      

  4.   

    回复人: kuki84() ( ) 信誉:57 
    用第三个类。
    这个类从CLASSA CLASSB中继承!!DELPHI不支持多个父类的继承
      

  5.   

    只要其中一类里对另个的引用放到implementation后,这是正解 .
      

  6.   

    看来你不但没有看书,而且还没有动脑。
    DELPHI早考虑过这个问题了。
    楼上正解。
      

  7.   

    设计问题,可以把AClass,BClass放到同一个单元里面,也可以独立一个UnitC出来,实在要这样使用可以使用类型强制:
    unit A
    interface
    uses B
    type AClass=class
      protected
        iBClass:BClass;//此处引用B类
    end;-------
    unit B
    interfacetype BClass=class
      protected
        iAClass:TObject;//此处引用A类
    end;在B的Impl部分添加uses A,
    在编码的时候,使用
    AClass(iAClass)即可。
      

  8.   

    A说:B,你是我的儿子.
    B说:A,你是我的儿子.
    路人C:你们都有病!
      

  9.   

    这恐怕不是DELPHI的死穴哦!!检查一下是不是你的!
      

  10.   

    回复人: win9000(foreweb) ( ) 信誉:100  2005-03-09 13:40:00  得分: 0  
     
     
    A说:B,你是我的儿子.
    B说:A,你是我的儿子.
    路人C:你们都有病!
      
     
    这个比喻不恰当
      

  11.   

    哦,应该是:AClass说:BClass,你是我的儿子.
    BClass说:AClass,你是我的儿子.
    Class:有病怎么的?任何直接互相引用,肯定是思路错乱,尽管也有实现某个特定目的的可能,但绝对可以通过另外的方法实现,此等方法比goto病状更重.
      

  12.   

    大家搞明白问题再回到好不,不要讥笑人家。互相引用是可以的,delphi的vcl中很多这样的例子,但必须是在同一个单元里。
    比如
      TCustomGrid = class(TCustomControl)
      private
        FHitTest: TPoint;
        FInplaceEdit: TInplaceEdit;
        TInplaceEdit = class(TCustomMaskEdit)
      private
        FGrid: TCustomGrid;
      事实说明一切
      

  13.   

    楼上说的对,放在一个Unit中就可以避免循环引用。
    但交叉引用在逻辑上肯定是有问题的。goto只是有可能造成结构问题。
      

  14.   

    oolong的方法是类的向前引用,一般是同一文件中存在工厂模式时使用的。
    楼主注意了,这个问题不是delphi的。是Pascal语法不支持,我想应该是语言的编译器不支持吧:)
    请参考《Pascal 语言精要》