2012-03-13 9 views
0
class A : boost::noncopyable{ 
}; 
class B{ 
    A & conn() const; 
}; 

どのように宣言していることを与えられたCONN()を実装します:返す参照

  • connは作成して
  • 私は壊すことができないタイプAのオブジェクトへの参照を返す必要がありますBを使用してクライアントコード内のBのインターフェイス。
  • 私はコードがメモリをリークするのを防ぎたいので、単にヒープ内のオブジェクトへの参照を に返すことはできません。

タイプA *への変換がないので、クライアントコードを破らないスマートポインタの実装が見つかりませんでした。クライアントコードをそのまま残しておけば、メモリリークが発生します。敬具

+0

なぜリファレンスを返すのですか?また、私はあなたがスマートポインタについて何を意味するのかよく分かりません。あなたはどこで 'A *'に変換する必要がありますか? –

+0

conn()は呼び出されるたびに新しいインスタンスを作成する必要がありますか? – juanchopanza

+0

@juanchopanza:yes – user311174

答えて

2

conn()スマートポインタ(この場合はstd::unique_ptr)を新しいAに作成し、そのようなスマートポインタのデータメンバーコンテナに配置し、管理対象オブジェクトへの参照を返しますスマートポインタ。 conn()メソッドがconstであるため、コンテナmutableを宣言する必要があります。私はそれが良いデザインだと言っているわけではない、ちょうどあなたの要件を満たすことでした。 constのメソッドを介して、すべてのAのオブジェクトの寿命はところで、あなたのインターフェイスは、オブジェクトへの非const参照を提供し、心に留めてBにバインドされている

class B { 

public: 
    inline A& conn() const { 
    data_.emplace_back(new A); 
    return *(data_.back().get()); 
    } 

private: 
    mutable std::vector<std::unique_ptr<A>> data_; 
}; 

:たとえば、C++ 11を使用。これはあまり良くありません!

+0

+1。これは私の頭の中にあったアイデアですが、答えに回すのは怠惰でした... –

1

戻り、関数レベルの静的オブジェクトへの参照:私はこれを行うには良いことですが、それは問題を解決する一つの方法だと主張していないよ

A& b::conn() const 
{ 
    static A theA; 
    return theA; 
} 

+0

okですが、このコードは一度発生するコードでは、「作成して返す」要件を満たしていません。 – user311174

+0

その場合、Aのポインタの静的ベクトルを持つことができます - これは正しい解決策であるとは言いません!!! – Nick

0

あなたは参照を返すことができるようにBのデータメンバーとしてAインスタンスを追加する必要があります(またはconn内の静的インスタンスを使用しますが、それは、トラブルのトンをもたらし、火のように避けるべきです)。これはAPIを破るものではありませんが、ABIを破ります。