2016-05-15 3 views
0

selector_interface_tのインターフェイスとこのインターフェイスの実装pin_selector_tがあるとします。インターフェイスの実装のパスと格納

class selector_interface_t 
{ 
    public: 
     virtual void select(uint8_t address) = 0; 
     virtual void deselect() = 0; 
}; 

class pin_selector_t : public selector_interface_t 
{ 
    private: 
     uint8_t mask; 

    public: 
     pin_selector_t(uint8_t mask); 
     void select(uint8_t address); 
     void deselect(); 
}; 

そして今、我々は、オブジェクトの魔女を渡したいが、他のmyclass_t方法(例えば。strobe)による将来の使用のためのクラスmyclass_tとストアにこのインタフェースを実装しています。

class myclass_t 
{ 
    private: 
     selector_interface_t * selector; 

    public: 
     myclass_t(selector_interface_t & selector); 
     void strobe(uint8_t pin); 
}; 

myclass_t::myclass_t(selector_interface_t & selector) // : selector(selector) 
{ 
    // ... 
} 

void myclass_t::strobe(uint8_t pin) 
{ 
    this->selector->select(pin); 
    this->selector->deselect(); 
} 

唯一の方法は、ポインタまたは参照によるパスの実装です。私は第二の解決策を好むし、参照によって渡す。しかし、インターフェイス実装のオブジェクトの存続期間のために、この参照を単にmyclass_tオブジェクトに格納することはできません。コピーを作るほうがよいでしょう。しかし、私はselector_interface_tフィールドのメンバーを持つことはできません。私は参照またはこの型へのポインタを持つことができます。私はmallocの使用を避けたいと思います。私はそれで何ができますか?

答えて

1

selector_interface_t型を作成した方は、shared_ptr内に格納し、myclass_tクラスにweak_ptrまたはshared_ptrを保持させることができます。

あなたがselector_interface_tを作成している人ではない場合は、オブジェクトを有効に保つ他の方法があると仮定して、ライフタイムを管理するクラスにラップし、そのオブジェクトをshared_ptrでラップします。

0

実装に正しい寿命があることを保証できない場合は、実装を動的に割り当てる必要があります。 (。new、ないmallocを使用して)

私は強くshared_ptr<selector_interface_t>またはunique_ptr<selector_interface_t>のいずれかを使用することをお勧めし - あなたはクライアント間で実装オブジェクトを共有するかどうかによって異なります。わずかな労力で正しいコードを得ることができます。

関連する問題