2014-02-01 1 views
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

Начнем с очевидного вопроса: если вам нужен открытый доступ к результату, почему бы не сделать его общедоступным или предоставить общедоступный метод доступа? –

ответ

1

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

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

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

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

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

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