2

共有アレイを後押しするのは初めてです。

2つの配列を宣言する既存のコードがあります。

boost::shared_array<unsigned char> src; 
boost::shared_array<unsigned char> dest; 

私がやりたいのは、各配列が指しているものを交換することです(srcはdestになり、destはsrcになります)。私が理解しているように、shared_array.get()メソッドは、その要素の1つへのポインターを返します(任意のタイプにすることができます)。

したがって、追加された宣言は次のとおりです。

boost::shared_array<unsigned char> temp;

そして、私の追加したコードは次のとおりです。

temp.get() = src.get();
src.get() = dest.get();
dest.get() = temp.get();

これらの各行は失敗します。コンパイルエラーはC2016です:'=':左のオペランドはl値でなければなりません。

私はC++の初心者なので、エラーをグーグルで検索したところ、そのエラーメッセージは、左側のオペランドを割り当てできないことを意味していることがわかりました。ただし、左側はすべてポインターであり、ポインターを他のポインターに割り当てることができます。

だから私は何が間違っているのかわかりません。誰かが私を助けてくれますか?

前もって感謝します。

jbu

4

3 に答える 3

7

shared_array2つ(または他のほとんどのBoost共有ポインター型)を交換する正しい方法は、swapメンバー関数を使用することです。

src.swap(dest);

shared_arrayこれにより、各sで使用されるポインタと参照カウントが交換されます。

void swap(shared_array<T> & other)
{
    std::swap(px, other.px);
    pn.swap(other.pn);
}
于 2009-11-18T18:13:26.427 に答える
2

swap(src,dest)トリックを行う必要があります。

あなたが間違っていることに関しては:あなたにオブジェクトsrc.get()からのポインタのコピーを与えるshared_arrayので、あなたがそれに割り当てることができたとしても、shared_arrayそれ自体は変わらないでしょう。次のように、ある配列を別の配列に割り当てることができます。

boost::shared_array<unsigned char> temp = src;
src = dest;
dest = temp;

ただし、swapより効率的であり、例外をスローしないことが保証されています。

于 2009-11-18T18:12:46.833 に答える
2

元の問題の場合:のswap()メソッドを使用するだけですboost::shared_array。(恐れることはありません、それは何もmemcpyしません。)

によって返されるポインタはget()、あなたの場合はl値ではありません。これは、ポインタが指しているデータではなく、ポインタ自体の値を変更したいためです。したがって、ここでポインタへの参照が必要になります。

于 2009-11-18T18:18:39.083 に答える