-2

まず第一に、タイトルは申し訳ありませんが、簡単に説明するのは非常に難しいです。次に、問題はこれです。Tclass1とTclass2の2つのクラス(オブジェクト)があります。これらはそれらから独立しており、両方のクラス(オブジェクト)が3番目のクラス(オブジェクト)を呼び出します。たとえば、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メソッドを呼び出してインスタンス化します。今、私がそれを実行するとき、例外を作ります、しかし私はそれを読むことができません。なぜならコンソールは速く閉じられているからです。クラス(オブジェクト)に変数の同じルールを適用しました。実際、変数を使用して配置すると、すべて正常に機能します。class(object)で同じように解くことはできませんか?どうもありがとうございました。

4

2 に答える 2

4

あなたの質問は少し曖昧です。しかし、私に理解させてください。

  1. 3番目のクラスのインスタンスを所有する2つのクラスがあります。(クラスの作成と削除を担当します)。
  2. 2つのクラス間で(クラス自体ではなく)情報を共有したいとします。

その場合、あるオブジェクトのフィールドを別のオブジェクトにコピーするAssignメソッドを作成できます。

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;

2つの間で同じオブジェクトを共有する場合は、どちらのクラスがオブジェクトを所有するかを決定する必要があります。(または、別の所有者を作成することもできます)。ただし、より良い解決策は、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 に答える