3

(C++ 11を使用し、できれば下位(ブーストまたはTR1)互換のスマートポインタータイプを使用して)達成する方法について疑問に思っています:

1 つのクラス インスタンス ( ModelController) がリソース ( ) を所有し、InputConsumer別のコンポーネント ( InputSender、この場合はシングルトン) がそのリソースにアクセスできます。

モデルはInputSenderへの参照のリストを保持しておりInputConsumers、その中には多くのものがあります。

ModelControllerには、 がまったくないか、1 つまたは多く含まInputConsumersれている可能性があり、 が多数含まれている可能性がありますModelController。はInputSender認識していません。

これが良いことです:個人が有効かどうかを自分で確認できるように、割り当てられたものInputSenderを追跡する方法。InputConsumersInputConsumers

weak_ptrそれらの使用にはこの条件を確認する必要があるため、この目的には完璧だと思います。

InputSenderがその参照のいずれかの追跡を停止した場合weak_ptr、悪いことは何も起こらず、対応するInputConsumerは無線沈黙を経験するだけです。

が削除された場合ModelController、またはがそののModelController一部を削除した場合、それらに登録されている は、次にアクセスしようとしたときに、存在しないことを認識し、メッセージを送信する必要なくクリーンアップできます。または何でもします。InputConsumerInputSender

shared_ptr問題は、これはandを使用するのに適した状況weak_ptrですか? s は概念的に s によって所有されているため、メンバー変数にする必要があるshared_ptrため、完全に適切かどうか疑問に思います。経由でのみ管理することがどれほど意味があるのか​​ わかりません。と一緒に動作するかどうかはわかりません。のctor / dtorでsを管理するだけですか?InputConsumerModelControllerModelControllershared_ptrunique_ptrweak_ptrshared_ptrModelController

また、よく知られた (私にはわからない!) これが当てはまるデザイン パターンがあるかもしれないので、そのようなことを知っている人がいたら教えてください。

4

2 に答える 2

0

std::weak_ptr ダイナミクスを示す完全な作業スニペットをもう 1 つ追加すると、もう少し役立つかもしれません。(私は特にこの expired() セマンティクスが好きでした);

#include<iostream>
#include<memory>
#include<string>

class MessageProcessor{                
};

class Message{
public:

        Message(std::shared_ptr<MessageProcessor>  _msg_proc, int _id){
                proc_weak = std::weak_ptr<MessageProcessor>(_msg_proc);
                proc_shared = _msg_proc;
                id = _id;
        }

        std::weak_ptr<MessageProcessor> proc_weak;
        std::shared_ptr<MessageProcessor> proc_shared;        
        int id;
};

int main(){

        std::shared_ptr<MessageProcessor> proc(new MessageProcessor());

        Message msg(proc,1);

        // Here we have proc with 2 shared_ptr refs: 'proc' and 'msg.proc_shared'
        // As expected 'msg.proc_weak is not expired'
        if( !msg.proc_weak.expired() )
                std::cout << "1) proc_weak is not EXPIRED. proc.use_count() == " << proc.use_count() << std::endl;        

        // make one of shared_ptr ref, point to other place
        msg.proc_shared = std::shared_ptr<MessageProcessor>();        

        // there is still the 'proc' reference        
        if( !msg.proc_weak.expired() )
                std::cout << "2) proc_weak is not EXPIRED (yet). proc.use_count() == " << proc.use_count() << std::endl;

        // 'erase' the last reference
        proc = std::shared_ptr<MessageProcessor>(); 

        // Finally... There is no more refs in shared_pointer!
        if( msg.proc_weak.expired() )
                std::cout << "3) proc_weak has EXPIRED. proc.use_count() == " << proc.use_count() << std::endl;

        return 0; 
}
于 2014-01-30T10:40:33.443 に答える