Страница: 1 |
Страница: 1 |
Вопрос: Конструктор копирования
Добавлено: 25.05.05 11:18
Автор вопроса: LamerOnLine | ICQ: 334781088
Ну, тема такая - нужно создать копию существующего объекта. Присваивать можно только указатель на существующий объект, при передаче объекта byVal все равно передается ссылка. Как можно создать копию объекта без поэлементного копирования?
Ответы
Всего ответов: 7
Номер ответа: 1
Автор ответа:
ANDREY Z5Z
Вопросов: 38
Ответов: 125
Web-сайт:
Профиль | | #1
Добавлено: 25.05.05 11:33
Как насчет ObjPtr(Ptr)?
Функция ObjPtr служит для получения указателя на объект (адрес объекта в памяти). Возвращает данные типа Long, содержащие указатель на объект. Ptr - Обязательный аргумент - объектная переменная, указатель на которую требуется получить.
Dim col As New Collection
Dim obj As CPerson
' create a new CPerson object and add it to the collection
Set obj = New CPerson
obj.Name = "John Smith"
col.Add obj, CStr(ObjPtr(obj)) ' ключ должен быть строкой
col.Remove CStr(ObjPtr(obj))
Номер ответа: 2
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #2
Добавлено: 25.05.05 14:54
Спасибо, конечно, за справку, но она тут совсем не уместна. Я знаю что такое ObjPtr, но как его применить в данной ситуации.
Поясню еще раз. Мне не нужно запихнуть объект в коллекцию, мне нужно создать новый объект - копию предыдущего. То есть, чтобы все члены объекта Obj1 были идентичны членам Obj2. С ObjPtr я могу разве что заменить указатель на vtbl, что опять же эквивалентно ссылке на объект. Мне же надо создать новый.
Надеюсь в этот раз понятно объяснил.
Номер ответа: 3
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #3
Добавлено: 25.05.05 16:17
Никак не сделать без поэлементного копирования.
Собственно, вынесенный в заголовок темы конструктор копирования обычно занимается именно этим.
Номер ответа: 4
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #4
Добавлено: 25.05.05 17:38
Оно понятно, но если подумать над нестандартными решениями. Дело в том, что конструктор копирования определяется в самом классе, мне же надо копировать эземпляр произвольного класса даже не имея понятия о его членах. Может стоит копать в сторону выделения памяти и CopyMemory?
Номер ответа: 5
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #5
Добавлено: 26.05.05 10:50
Ну никак. Это ты спрашивал на исходниках? Там же сказали, что никак. Это дело внутреей организации объекта. Единственное, IPersist. Но этот интерфейс не обязан поддерживаться или корректно работать.
Номер ответа: 6
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #6
Добавлено: 26.05.05 11:22
Не, не я. Кроме того, если люди говорят что никак - это еще не значит НИКАК, это значит что они просто не знают
Номер ответа: 7
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #7
Добавлено: 27.05.05 05:11
Иногда действительно не знают.
Никак, потому что
1. Ты не знаешь, какой размер в памяти занимает объект
2. Объект может содержать указатели, и в этом случае конструктор копирования должен создать также копии тех вещей, на которые эти указатели указывают. А "те вещи" тоже могут содержать указатели. В том числе и на друг друга, а также на первоначально клонируемый объект.