Разименование указателя

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Здравствуйте,
Обстановка - CW5
Кто подскажет как решить проблему, в Си это решается а вот как сделать для Clarion: Нужно осуществить копирование одного объекта в другой.
Классы объектов имеют общего предка.

Код: Выделить всё

UserClass.CopyProp PROCEDURE(*BaseClass PtrClass)
 CODE
  PARENT.CopyProp(PtrClass)
  SELF.NameUser = (*UserClass) PtrClass  !!! НУЖНО ВЫПОЛНИТЬ  !!!
                  ^^^^^^^^^^^^^^^^^^^^^
                   ВОТ В ЧЁМ ВОПРОС
--
С уважением!,
Селин_К.Е. mailto:kada@adm.kaluga.ru

(Добавление)

Ишь чего захотел! :) На это кишка тонка у велосипедисттов :D
Self.NameUser это что? В смысле, какого типа аттрибут?
Если ссылка то SELF.NameUser &= (PtrClass)

Best regards,
Andrew Listiev
Work mailto:andrewl@inbox.lv
Home mailto:gidravlic@mhm.lv
ICQ UID: 169357390
MS Messenger: werdna_werdna@hotmail.com
Написал: ClaList(2)
Гость

Сообщение Гость »

ИЗВИНЯЮСЬ !!!
Не тот пример приклеил, должно быть, но проблема осталась

Код: Выделить всё

UserClass.CopyProp PROCEDURE(*BaseClass PtrClass)
ptrUser &UserClass
 CODE
  PARENT.CopyProp(PtrClass)
  ptrUser &= PtrClass
         ^^^^^ Ошибка
  
  SELF.NameUser = ptrUser.NameUser       !!! НУЖНО ВЫПОЛНИТЬ  !!!
где UserClass наследуемый от BaseClass

соответственно получаю ошибку Illegal reference assignment or
equivalence :((

Обнаружился ещё один вопрос:

Код: Выделить всё

p1 GROUP
fc1  &UserClass
 END

p2 GROUP
fc2  &UserClass
 END

pp1 LIKE(p1)
pp2 LIKE(p2), OVER(pp1)  ! ВОТ ЗДЕСЬ РУГАЕТСЯ , т.е. не хочет выполнять OVER для груп содержащих ссылку
Как быть ?

--
Best regards,
Селин_К.Е.


(Добавление)

Совершенно правильно. Нельзя вместо наследника использовать родитиля.
Чревато большими проблемами. У родителя может не оказаться методов и свойств наследника. Наоборот можно.

WBR, Nick Tsigouro. MailTo:Nick@arsis.ru

А как можно по другому реализовать указанный ниже пример?
Нужно перебирать очедь объектов созданных от различных классов, созданных из базового класса.

Код: Выделить всё

BaseClass CLASS,TYPE
NameBase    STRING(40)
Init        PROCEDURE(STRING pName),VIRTUAL
CopyProp    PROCEDURE(*BaseClass PtrClass),VIRTUAL
          END

UserClass CLASS(BaseClass),TYPE
NameUser    STRING(40)
Init        PROCEDURE(STRING pName),VIRTUAL
CopyProp    PROCEDURE(*BaseClass PtrClass),VIRTUAL
          END

RefOneUserClass  &BaseClass
RefTwoUserClass  &BaseClass

 MAP
 END

 CODE

 RefOneUserClass  &= NEW(UserClass)
 RefTwoUserClass  &= NEW(UserClass)

 RefOneUserClass.Init('User')

 RefTwoUserClass.CopyProp(RefOneUserClass)

 Dispose(RefOneUserClass)
 Dispose(RefTwoUserClass)

 ....
--
Best regards,
Селин_К.Е.

Строго говоря никак. Задачу нужно решать по другому. Очередь из объектов произвольного типа в клаше создать нельзя.
В этом примере оба объекта имеют BaseClass, и проблемы нет, но это наверно просто опечатка.

Как я понимаю, список (очередь) объектов нужен для того, чтобы потом искать нужный объект и обращаться к его методам. В этом случае нужно определять интерфейсы и в очередь помещать ссылки на интерфейсы. При этом не будет проблемы с тем, что экземпляры объектов принадлежат к разным классам. У них д.б. общие интерфейсы.

WBR, Nick Tsigouro

В принципе, можно рискнуть и использовать ptrUser &= (PtrClass), но все(контроль), конечно будет взвалено на плечи программиста.

Best regards,
Andrew Listiev

Спасибо все кто ответил, решение нашлось, незнаю конечно насколько это правильно, НО РАБОТАЕТ !!!

Код: Выделить всё

UserClass.CopyProp PROCEDURE(BaseClass PtrClass)
ptrUser &UserClass
 CODE                        
   PARENT.CopyProp(PtrClass)
   ptrUser &= Address(PtrClass)

   SELF.NameUser = ptrUser.NameUser
--
Best regards,
Селин_К.Е.
Написал: ClaList(2)
Гость

Сообщение Гость »

Что-то я не понял - свойство NameUser где определено?
Если в базовом классе, то и обьявляй ptrUser как &BaseClass.
Если этого свойства нет в базовом классе, то ОТКУДА оно берется у потомков? Значит - а) есть еще один родительский класс и б) оно обьявлено в каждом потомке отдельно.
Если а), то обьявляй классы именно от этого промежуточного родителя. Если б), то делай "глубокое присваивание" структур классов как групп ptrUser :=: PtrClass.
pp1 LIKE(p1)
pp2 LIKE(p2), OVER(pp1) ! ВОТ ЗДЕСЬ РУГАЕТСЯ , т.е. не хочет выполнять OVER для груп содержащих ссылку
Попробуй так:

ptr_fc1 LONG,OVER(p1)
ptr_fc2 LONG,OVER(P2)

p1.fc1 &= ...
ptr_fc2 = ptr_fc1
!можно использовать p2.fc2

=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

Поле NameUser определено в классе потомке от базового класса.
Оператор :=: для общего случая, когда в классе потомке могут присутствовать сложные типы даных типа ссылок на очереди и другие классы не работает, так как в Clarion нет возможности переопределять операторы (например как в C++)по аналогии с перегрузкой процедур.

--
Best regards,
Селин_К.Е.
Написал: ClaList(2)
Ответить