Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> конструктор копирования, как реализовать 
:(
    Опции темы
JUmPER
Дата 20.11.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



не нашёл такого в мсдн (вроде как такого в vb6 нет)
у кого-нибудь есть светлые идеи, как это реализовать средствами языка?
--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
Naghual
Дата 20.11.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Светлые идею появятся сразу, как только будет ясно что такое конструктор копирования.
Ты просвети нас.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
JUmPER
Дата 20.11.2006, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



в C++ есть такое понятие как "конструктор копирования"
Цитата

Работа конструктора копий (copy constructor) заключается в предоставлении возможности инициализации (создания) нового объекта из уже существующего

т.е. при присваивании объекту А объекта Б копируется не ссылка а копия объекта Б (причём создаётся эта копия автоматически)
--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
Naghual
Дата 20.11.2006, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Ну мы С++ не изучали...

Если говорить о рантайм, то посмотри инструкции ByVal и ByRef.
Если времени разработки - то я не понял вопроса.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
JUmPER
Дата 20.11.2006, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



рантайм

пример использования:
Код

dim a as my_class
dim b as my_class

' тут инициализируем объект "a"
' ...

' копируем: тут должен неявно вызываться конструктор копирования для класса "my_class"
set b=a

' тут "b" и "a" ссылки не на один объект а на разные
' ...

--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
Naghual
Дата 20.11.2006, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Мда... 
Интересный вопрос. Будем думать.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
Naghual
Дата 20.11.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Подумал я пришел к выводу что стандартными и известными мне нестандартными способами этого не решить.

Вопрос:  ты работаеш с самописными классами? т.е. нужно создать копию своего класса?

Со своим классом решение есть.
С чужим - только ручками.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
JUmPER
Дата 20.11.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Цитата(Naghual @  20.11.2006,  15:16 Найти цитируемый пост)
Со своим классом решение есть.

со своим, я про это же и спрашиваю smile 
--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
Naghual
Дата 20.11.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Решение опять-же Ручками, но случай тут частный, так как известна вся подноготная класса.

Создай в классе функцию создания копии.
Ну например так:
Код

Public Function Clone() as my_class
    dim NewClass as my_class

    set NewClass = New
    NewClass.X = pvar_X
    NewClass.Y = pvar_Y
    ...
    set Clone = NewClass
End Function



--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
JUmPER
Дата 20.11.2006, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



я же спрашиваю про неявное копирование, явное - ясное дело - очевидно...
--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
Naghual
Дата 20.11.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Да я понимаю.
Но с неявным копированием напряг.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
Voldemar2004
Дата 20.11.2006, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: 7
Всего: 23



Имхо конструктор копирования применяется, когда мы создаем свой собственный объект (а в ВБ все объекты уже готовы - все остается только на совести разработчиков), одним из полей которого является указатель на тип. Если не создать КК, будет утечка памяти, если нет КК компилятор сам его создаст, но тоже будет утечка памяти.

Оффтоп: долго не мог понять по названию темы: я в С++ или в...


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
JUmPER
Дата 21.11.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



родил-таки я =)
правда кривовато, но бейсик лучше это сделать не даёт

сам класс:
Код

Option Explicit

Private my_name As String

' делаем его св-вом по умолчанию
Public Property Let self(ByRef new_me As CTest)
    Call Me.init(new_me.Name)
End Property

' инициализатор
Public Sub init(aName As String)
    my_name = aName
End Sub

' доступ тестовому к полю
Public Property Get Name() As String
    Name = my_name
End Property

Public Property Let Name(aNewName As String)
    my_name = aNewName
End Property


демострация
Код

' экземпляр должен быть создан
Dim t1 As New CTest
Dim t2 As New CTest

Call t2.init("t2")

' используем let, а не set
' т.к. при использовании set бейсик, по ходу, не смотрит на свойства по умолчанию =(
t1 = t2
t1.Name = "t1=)"

Call MsgBox(t1.Name & " " & t2.Name)

--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
Naghual
Дата 21.11.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



JUmPER, это не есть решение. Это но копирование класса. Это задание одного единственного свойства по умолчанию в момент инициализации.

Это совсем не то о чем вы спрашивали.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
JUmPER
Дата 21.11.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



наоборот, это и есть неявное создание нового экземпляра класса при копировании, что собственно и требовалось
т.е. после присвоения существуют два независимых экземпляра
--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
Naghual
Дата 21.11.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Новый экземпляр класса у тебя есть еще на стадии обьявления переменных.
Код
Dim t1 As New CTest
Dim t2 As New CTest



Идея твоего вопроса заключалась в следующем.

Создавался Класс1. Его свойства были заданы.
На его основе создается Класс 2. На этом этапе, значения свойств класса 2 идентичны значениям класса 1.
Экземпляры не связаны. Тоесть при изменении значения свойства в классе 1, значение в классе 2 не изменяется.

Вот это и есть то, что в С++ называется конструктор копирования.

Это сообщение отредактировал(а) Naghual - 21.11.2006, 11:59


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
JUmPER
Дата 21.11.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



ну да, это и происходит в моём примере
--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
Naghual
Дата 21.11.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



нет. не происходит.
добавь в класс любое свойство и проверь.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
JUmPER
Дата 21.11.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



у нас же есть св-во "name" собственно оно для проверки и есть
msgbox выдаёт два различных значения для него...
--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
Naghual
Дата 21.11.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Name ты переназначаеш при операции присвоения. Оно не показательно, так-как самозаполняется при инициализации. Оно не копируется из первого класса.

Серьезно. Добавь классу еще одно свойство и проверь.

Это сообщение отредактировал(а) Naghual - 21.11.2006, 12:17


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
JUmPER
Дата 21.11.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



тут дело не в "самокопировании", а именно в создании копии при присвоении
а то, что это полностью реализуется руками разработчика класса -- так это из-за самого бейсика smile 

а в "Let" можно задать и остальные поля
--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
Naghual
Дата 21.11.2006, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Цитата(JUmPER @  21.11.2006,  12:21 Найти цитируемый пост)
а в "Let" можно задать и остальные поля


Тогда я вообще не вижу смысла в данной теме, так как на лицо явное копирование значений!


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
JUmPER
Дата 21.11.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



явное копирование внутри класса, а снаружи это выглядит как конструктор копирования, что собственно и требовалось
"то что снаружи выглядит как нечто, и есть это нечто"
--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
Naghual
Дата 21.11.2006, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Цитата(JUmPER @  21.11.2006,  12:27 Найти цитируемый пост)
явное копирование внутри класса, а снаружи это выглядит как конструктор копирования

Ок. Покажи пример на своем же примере.



--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
JUmPER
Дата 21.11.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Код

Dim t1 As New CTest
Dim t2 As New CTest

Call t2.init("t2")

' снаружи это выглядит как простое копирование
t1 = t2

' тут мы имеем два одинаковых экземпляра, а не две ссылки на один
' с одинаковыми значениями полей. смотрим:
Call MsgBox(t1.Name & " " & t2.Name)

' меняем св-во одного из них, чтобы продемонстрировать, что это
' два различных экземпляра
t1.Name = "t1=)"
' смотрим:
Call MsgBox(t1.Name & " " & t2.Name)
' значения полей различны, что и требовалось доказать


Код

' класс CTest
Option Explicit

Private my_name As String
'

' делаем его св-вом по умолчанию
Public Property Let self(ByRef new_me As CTest)
    ' изнутри приходится всё делать "своими руками"
    Call Me.init(new_me.Name)
    ' можно и так:
    ' Name=new_me.Name
    ' тут присвоение другим полям
    ' ...
End Property

' инициализатор
Public Sub init(aName As String)
    my_name = aName
End Sub

' доступ тестовому к полю
Public Property Get Name() As String
    Name = my_name
End Property

Public Property Let Name(aNewName As String)
    my_name = aNewName
End Property

--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
Naghual
Дата 21.11.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Ясно. Убедил.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0662 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.