-2

首先,对不起标题,但很难用几句话解释好。那么问题就是这个。我有两个类(对象):Tclass1 和 Tclass2。这些与它们无关,并且两个类(对象)都调用第三个类(对象):例如 Tclass3。因为我可以在 Tclass1 和 Tclass2 之间共享 Tclass3 的信息?

尝试用一个例子更好地解释:

Tclass1 = class
private
  class3: Tclass3;
public
  property err: Tclass3 read class3 write class3;
  ...
end;

Tclass2 = class
private
  class3: Tclass3;
public
  property err: Tclass3 read class3 write class3;
  ...
end;

Tclass3 = class
private
  icode: word;
public
  property code: word read icode;
  ...
end;

主要程序是:

var
  class1: Tclass1;
  class2: Tclass2;
begin
  class1 := Tclass1.create;
  try
    class2 := Tclass2.create;
    try
      class2.err := class1.err;  // <--- problem is here
         ...
         ... // processing...
         ... 
      class1.err := class2.err;  // <--- problem is here
      writeln (class1.err.code)      
    finally
      class2.free; 
    end;
  finally
    class1.free;
  end;
end;

当然,在 Tclass1 和 Tclass2 中,我调用了 Tclass3 的 create 方法并将其实例化。现在,当我运行它时,会出现异常,但我无法读取它,因为控制台已快速关闭。我已将变量的相同规则应用于类(对象);事实上,如果我使用变量来放置它,一切正常。不能用类(对象)解决吗?再次非常感谢。

4

2 回答 2

4

你的问题有点含糊。但让我试着理解。

  1. 您有两个类,它们拥有第三个类的实例。(他们负责创建和删除类)。
  2. 您希望在两个类之间共享信息(但不是类本身)。

在这种情况下,您可以创建一个将一个对象的字段复制到另一个对象的分配方法:

Tclass3 = class
private
  icode: word;
public
  procedure Assign(const AValue: TClass3); virtual;

  property code: word read icode;
  ...
end;

procedure TClass3.Assign(const AValue: TClass3);
begin
  Assert(AValue<>nil);
  icode := AValue.icode;
end;

如果要在两者之间共享同一个对象,则需要确定哪个类拥有该对象。(或者您甚至可以创建一个单独的所有者)。但更好的解决方案是使用 TClass3 的接口,这样您就可以利用引用计数。

于 2011-09-24T19:32:36.123 回答
1

“现在当我运行它时,例外,但我无法读取它,因为控制台关闭得很快。”

您可以按如下方式解决该问题:

在您的控制台应用程序的 .dpr 文件中,您可能有这样的内容:

begin
  try
    // do stuff
  except
    on e:Exception do
      writeln(e.message);
  end;
end.

只需将其更改为:

begin
  try
    // do stuff
  except
    on e:Exception do
    begin
      // show error, and wait for user to press a key
      writeln(e.message);
      readln;
    end;
  end;
end.

这应该使调试更容易一些。

于 2011-09-25T14:53:16.623 回答