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_array
s (или большинство других типов общих указателей Boost) должен использовать swap
функция-член:
src.swap(dest);
Это меняет местами указатели и счетчики ссылок, используемые каждым из shared_array
s:
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-значением, потому что вы хотите изменить значение самого указателя, а не данных, на которые он указывает. Так что вам нужна ссылка на указатель здесь.