1

クラス A のメソッド (write と呼ばれる) を使用してファイル I/O を制御する必要があります。次に、A は、A.write() を呼び出して、ファイルに書き込む必要がある別のクラス B (A に基づいていない) をインスタンス化します。

これを達成するための最良の方法は何ですか?

Class.functionname (A.write) をパラメーターとして B.sometfunction のコールバックに渡す必要がありますか?

A.write スロットを作成し、B がシグナルを送信できるようにする必要がありますか?

より良い方法はありますか?(私は C++ で QT 5 を使用しています)


わかりました。説明に役立つ情報がいくつかあります。A はスレッドのコレクションで、それぞれが TcpSocket (クライアントからのコンソール セッション) です。B は私のロガー クラスであり、シングルトン パターンです。A スレッドはメッセージをファイルに記録しなければならない場合があり、B はそのファイルをフォーマットし、mutex を使用してファイルに書き込みます。これらの同じ (フォーマットされた) メッセージをコンソールに書き込む必要があります (A スレッドごとに一意のソケットであるため、静的メソッドにすることはできません)。したがって、A.something が B.write を (ファイルに対して) 呼び出し、次に B.write が A.write (コンソールに対して) を呼び出す必要があります。

4

2 に答える 2

3

A.write() を public にして、A から B へのポインターを与えるか、シグナル/スロット接続を使用して、B で単に emit mysignal(data); を使用します。スロット A.write()... に接続されています

于 2013-10-01T11:03:25.940 に答える
1

シグナル/スロット接続メカニズムを使用して、Bシグナルwrite()をパブリックAスロットに接続しdoWrite()ます。または、A::write()パブリックstaticメソッドのみを作成し、それを呼び出しますB

void B::write() {
    A::write();
    //...
}

または単にポインタまたは参照をAクラスのオブジェクトに渡し、Bこのポインタ/参照を介してパブリック メソッドを呼び出します。

void B::write(A& a) {
    a.write();
    //...
}

ただし、デザインを再考してください。ここで何かが正しくないことをあなた自身で感じていると確信しています。通常、これはジョブを実行するBで作成されたA(のメンバーであるA) のインスタンスです。

class A{
  B b;
  void write(){
    B.write();  // clear
  }
};

あなたのアプローチAでは、仕事をするために親を呼び戻すオブジェクトを作成します。

class A{
  B b;
  void foo(){
    B.write(
    // hey hey, I want A.write() come back!  -> confusing oOO
   );
  }
};
于 2013-10-01T11:13:31.163 に答える