C++ повысить указатели обмена общего массива (простой вопрос)

Я новичок в расширении общих массивов.

Существует существующий код, который объявляет два массива:

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

Все, что я хочу сделать, это поменять то, на что указывает каждый массив (src становится dest, а dest становится src). Насколько я понимаю, метод shared_array.get() возвращает указатель на один из его элементов (может быть любого типа).

Итак, мое добавленное объявление:

boost::shared_array<unsigned char> temp;

И мой добавленный код:

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

Каждая из этих строк терпит неудачу; ошибка компиляции C2016: '=': левый операнд должен иметь значение l.

Я новичок в C++, поэтому я погуглил ошибку и увидел, что это сообщение об ошибке означает, что левый операнд не может быть назначен. Все же левые части - все указатели, и указатели могут быть назначены другим указателям.

Так что я не уверен, что я делаю не так. Может кто-нибудь помочь мне?

Заранее спасибо.

JBU

3 ответа

Решение

Правильный способ поменять два shared_arrays (или большинство других типов общих указателей Boost) должен использовать swap функция-член:

src.swap(dest);

Это меняет местами указатели и счетчики ссылок, используемые каждым из shared_arrays:

void swap(shared_array<T> & other)
{
    std::swap(px, other.px);
    pn.swap(other.pn);
}

swap(src,dest) должен сделать свое дело.

Что касается того, что вы делаете неправильно: src.get() дает вам копию указателя из shared_array объект, поэтому даже если бы вы могли присвоить ему, это не изменит shared_array сам. Вы можете назначить один массив другому, например так:

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

но swap является более эффективным, и гарантированно не бросать исключения.

Для вашей первоначальной проблемы: просто используйте swap() метод boost::shared_array, (Не бойтесь, это ничего не изменит.)

Указатель возвращается get() в вашем случае не является l-значением, потому что вы хотите изменить значение самого указателя, а не данных, на которые он указывает. Так что вам нужна ссылка на указатель здесь.

Другие вопросы по тегам