2010-12-04 8 views
0

私は、MultinumberがPairs、Rational、およびComplexによって継承されるように、以下の関数と階層のクラスを持っています。これらのすべてはMultinumberで仮想的な機能を共有します。私の問題は次のコードです。今書き込まれている方法では、newElement変数がMultinumber**setArrayに追加されたときに範囲外になり、この関数内でメモリを割り当てる方法を理解する必要があります。奇妙なことに、ファンクションに渡されるパラメータは、たとえ最初の行に印刷されていても、空であるcout<<newElement->tostring();誰かが私に何か間違っていると教えてもらえますか?この関数内でのメモリの割り当て方法を教えてください。

bool Set::addElement(Multinumber* newElement) 
{ 
    bool success = false; 
    if(isFull()) 
    { 
     resize(); 
    } 
    if(!isMember(newElement)) 
    { 
     setArray[numElements] = newElement; 
     numElements++; 
     success = true; 
    } 
    return success; 
} 

EDIT:はいポスターが正しい、これはメモリのトラブルがstd::vector<boost::shared_ptr<Multinumber>> setArrayMultinumber** setArrayを置き換える避けるために宿題

+0

もっとコードが必要です。 'Set'クラス全体を投稿してください。また、 'Multinumber'の実装を見ると便利でしょう。 –

答えて

0

現実世界(宿題のためのyour previous questionからわかります)では、独自のセットを実装しません。標準ライブラリは、この機能を提供しています(std::set、C++ 0xを使用している場合や適切な拡張子があり、追加機能の速度に優先順位がある場合はstd::unordered_set)。

スマートポインタクラスを調べるべきでしょう。あなたのコードで

は、newElementがスコープの外に行くのではありません。言っ

。何が起こるかは、あなたが呼び出しコードのデータへのポインタを与えられているということです。そして、呼び出しコードは、指示されたものを範囲外にします。

As I responded以前の質問には、 "virtual cloneイディオム"を使用してコピーを作成する必要があります。

基本的には、渡された、指し示されたタイプのものであれば、コピーが作成されるようにnewに電話します。 「コピーが作成された」ことを確実にするには、コピーコンストラクターをnew、つまりnew whatever(my_existing_whatever_instance)で使用するのが自然です。しかしC++では、コンストラクタはvirtualになることはできませんので、実際にはnewコールに目的の型を入れることはできません。代わりに、メンバー関数でそれを偽造する必要があります。メンバー関数virtualであるため、正しい型番cloneが、実際に指し示されているもので検索されます。これは、独自の型を使用してnewを呼び出し、独自のコピーコンストラクタを呼び出します。リンクは詳細を提供します。

1

です。

0

成長が必要な場合は、タイプvector<Multinumber*>にして、setArray.push_back(newElement)を使用します。

ベクトルが有効である限り、発信者が要素を生かしておく必要があります。そうでなければ、コピーを返すMultinumberに仮想Cloneメソッドを追加します(サブクラスはそれを実装します)。次に、push_back(newElement->Clone())

+0

私は彼がベクトルではなくセットを望んでいると仮定します。つまり、各値のうちの1つしか存在しないという不変量を強制しています。私はさらに、前の質問に基づいて、彼は宿題の容器を実装する必要があると仮定します。 –

関連する問題