5

印刷ジョブを表すクラスがあるとしましょう: CPrintingJob. 印刷中のドキュメントについては何も認識せず、ジョブの状態 (ジョブがキューに入れられたか、拒否されたか、続行されたかなど) だけを認識します。

このクラスのオブジェクトは、印刷を行う必要があるたびにインスタンス化され、他のデータとともに印刷モジュールに渡され、ジョブの作成者がその状態をチェックして印刷がどのように進行しているかを確認するという考え方です。

が 2 つのインターフェースCPrintingJobを継承するとします。

class IPrintingJob // this one is to check the job state
{
    virtual TState GetState() const = 0;
    // ... some other state-inquiring methods

    class ICallback // job's owner is notified of state changes via this one
    {
        virtual void OnStateChange( const IPrintingJob& Job ) = 0; 
    };
};

class IPrintingJobControl // this one is for printing module to update the state
{
    virtual void SetState( const TState& NewState ) = 0;
    // ... some other state-changing methods
};

問題は、CPrintingJobオブジェクトを作成するクラスが にアクセスできないことですが、渡されるIPrintingJobControl印刷モジュールCPrintingJobはその状態を変更できる必要があるため、そのインターフェイスにアクセスできる必要があります。

これはまさに友達を使うべきケースだと思いますが、本質的に欠陥のあるメカニズムとして友達をいつも避けてきたので、友達を適切に使う方法がわかりません。

では、どうすれば適切に行うことができますか?

4

2 に答える 2

1

ファクトリを使用して、ファクトリにIPrintingJobのインスタンスを返すようにします(smart_ptr内にラップするのが最適です)。例えば:

 struct PrintingFactory {
   static auto create() -> std::unique_ptr<IPrintingJob> {
     return std::unique_ptr<IPrintingJob>(new CPrintingJob());//as there is currently no std::make_unique..
   }
 }

JobControlを使用する必要がある場合は、std::dynamic_pointer_castを介してポインターをキャストするだけです。

于 2012-12-03T10:15:28.303 に答える
0

しばらく検討した結果、次のように決定しました。

  1. このすべては、価値があるよりも間違いなく面倒です。

  2. 上記のMFHの回答の(わずかに変更された)バージョンが唯一の、したがって最善の方法です。

ご意見をお寄せいただきありがとうございます。確かに啓発的でした。

于 2012-12-03T11:46:47.503 に答える