【问题标题】:Problem about common class关于普通类的问题
【发布时间】:2011-09-24 18:55:26
【问题描述】:

首先,对不起标题,但很难用几句话来解释。 那么问题就是这个。我有两个类(对象):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 方法并将其实例化。现在,当我运行它时,会出现异常,但我无法读取它,因为控制台已快速关闭。 我已将变量的相同规则应用于类(对象);事实上,如果我使用变量来放置它,一切正常。 不能用类(对象)解决吗? 再次非常感谢。

【问题讨论】:

  • 这不是你的真实代码。它不会按原样编译,因为您在声明 TClass3 的私​​有字段之前声明它。您应该发布真实的代码,仅对其进行更改以删除无关信息并在需要时将其匿名化。发布编造的代码可能会改变或隐藏实际问题,并且很难为您提供帮助。此外,说there's an errorthrows an exception 没有任何关于错误或异常的信息意味着什么。发布 exact 错误或异常消息,包括提供异常的任何地址。我们无法从这里看到您的屏幕。
  • 另外,如果您添加一个try..except 块,您可以看到异常,在该异常块WriteLn 中,异常消息然后执行ReadLn 以阻止控制台窗口关闭。由 IDE 创建的裸控制台应用程序已为您预先编写了块。

标签: delphi delphi-xe2


【解决方案1】:

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

  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 的接口,这样您就可以利用引用计数。

【讨论】:

  • 请不要回答这样的非问题。它不会让这个问题在未来对其他人有用,它会鼓励这张海报和其他人提出其他不好的问题。 (请注意,我不会对原始问题或您的答案投反对票,顺便说一句。)在将它们编辑成真正的问题之前不回答它们有助于使该站点成为有用的资源并减少噪音和混乱。 :)
  • @Ken 你刚刚掉头了。
  • 嗯,你自己回答了这个问题。现在,您正在对只是想提供帮助的 Gamecat 做出判断。我认为这让 Gamecat 感到悲伤。
  • @GameCat:我不能代表政策;我只是回答问题。我只是发表了我的看法。我相信你回答了一个问题,因为它缺乏信息,对未来的读者/搜索者没有用处。接受您的答案意味着 OP 不会澄清这个问题,因为它对以后的任何人都没有用。如果我们不回答非问题,我们鼓励人们发布更好的问题,并且它们可供人们在未来寻找答案。它可能为您赢得了声望,但除此之外它毫无意义,这对本网站有害。
  • @ken 虽然我绝对同意这种观点,但这并不是一个糟糕的问题得到一个好答案的最令人震惊的例子。我会把讲座留作一个更强有力的例子。激励系统的有趣之处在于,有时它们工作得有点太好了......
【解决方案2】:

“现在当我运行它时,会出现异常,但我无法读取它,因为 控制台快速关闭。”

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

在您的控制台应用程序的 .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.

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

【讨论】:

  • 这 - 虽然肯定有帮助 - 不是问题的答案。
  • ...这就是为什么它应该是评论...然后OP可以编辑问题并添加他使用评论收集的信息...然后可以接受真正的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多