0

次の関数と、Multinumber が Pairs、Rational、および Complex によって継承されるようなクラスの階層があります。これらはすべて、Multinumber で仮想的な機能を共有します。私の問題は次のコードです。現在の書き方では、 newElement 変数は mysetArray型の my に追加されると範囲外になりMultinumber**、この関数内でメモリを割り当てる方法を見つける必要があります。奇妙なことに、最初の行に出力された場合でも、関数に渡されるパラメーターは常に空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;
}

編集: はい、ポスターは正しいです。これは宿題です。

4

3 に答える 3

1

Multinumber** setArrayメモリの問題を回避するには、に置き換えstd::vector<boost::shared_ptr<Multinumber>> setArrayます。

于 2010-12-04T20:28:11.710 に答える
0

大きくする必要がある場合は、型vector<Multinumber*>にして setArray.push_back(newElement) を使用します。

ベクトルが生きている限り、呼び出し元が要素を生き続けていることを確認する必要があります。そうでない場合は、コピーを返す (そしてサブクラスがそれを実装する) 仮想 Clone メソッドを Multinumber に追加します。次に、push_back(newElement->Clone()).

于 2010-12-04T20:30:05.523 に答える
0

現実の世界では (前の質問から、これは宿題だと理解しています)、独自のセットを実装することはありません。標準ライブラリはこの機能を提供します (std::set要素を順番に維持したいstd::unordered_set場合。C++0x を使用している場合、および/または適切な拡張機能を使用していて、追加機能よりも速度を優先している場合)。

おそらく、いくつかのスマート ポインター クラスも調べる必要があります。

それは言った:

あなたのコードでnewElementは、範囲外にはなりません。何が起こるかというと、呼び出し元のコードのデータへのポインターが与えられ、呼び出し元のコードは、ポイントされたものをスコープ外に出させます。

前の質問に答えたように、「仮想クローンイディオム」を使用してコピーを作成する必要があります。

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

于 2010-12-04T20:32:39.747 に答える