Копирование / перемещение структуры в другую

0

Когда вам не нужно иметь дело с указателями, копирование/перемещение структуры в другую довольно просто.
Однако в моем случае я должен иметь дело с указателями и правами доступа.

protected:
          addrinfo *hints, *result;
...
hints = new addrinfo;
...
getaddrinfo(0, port.c_str(),  hints, &result); // result is protected - can't do that.

memmove/memcpy можно использовать, но addrinfo содержит указатель на sockaddr внутри себя. Я думал использовать временную структуру, чтобы передать getaddrinfo а затем переместить все в result, но вопрос всегда есть.
Скажите, если вам нужны какие-то другие детали.

EDIT: @Mike Woolf, вы дали мне идею. Поскольку базовый класс является абстрактным, я даже могу сделать эти структуры общедоступными, так как у пользователя не было бы способа его исправить. Спасибо, однако, за ответ.

  • 1
    Давайте начнем с очевидного вопроса: если вам нужен публичный доступ к результату, почему бы не сделать его публичным или предоставить метод публичного доступа?
Теги:
struct
access-rights

1 ответ

1
Лучший ответ

В таком случае я бы написал свою собственную функцию копирования. Это может быть что-то вроде

void structCopy(struct* dest, const struct* src);

Внутри этой функции используйте memcpy(), чтобы скопировать все, кроме указателей.

Я должен был сделать что-то подобное, когда я делал многопользовательскую игру - копируя указатели вроде этого. В этом типе шаблона типично предположить, что это функция, которая точно понимает, что ей нужно делать, то есть structCopy() специально разработан для этой конкретной структуры. Поэтому он знает, что внутри объекта есть sockaddr.

Так что действительно, просто жесткий код внутри этой функции, как вы хотите ее обрабатывать. Вы хотите, чтобы он создал новый sockaddr на другом конце? Затем выполните функцию копирования. Или что-то работает.

TL; DR. Создайте специальную функцию копирования для вашей структуры, которая знает, что внутри структуры, и обработайте ее sockaddr в соответствии с вашими спецификациями. Сделав это частью класса (или функции друга), вы не нарушаете никаких правил, жестко кодируя эту функцию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню