Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Ошибка при обращении к свойствам потомка АВ (число прочтений - 2456 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Ошибка при обращении к свойствам потомка АВ
24. Декабря 2008 :: 09:23
Печать  
Создал класс "МойАВ", унаследовав его от АссоциативногоВектора:
Код
Выбрать все
//Класс МойАВ
Функция Этот(Конт) Возврат Конт; КонецФункции
Функция Сам() Возврат Этот(Контекст) КонецФункции

//------------------------------------ ------------------------------------
Процедура Конструктор()
	Сам().Добавить(111111,"Один");
	Сам().Добавить(222222,"Два");
	Сам().Добавить(333333,"Три");
КонецПроцедуры // Конструктор 


Делаю простой тест:
Код
Выбрать все
Процедура Сформировать()
	План = СоздатьОбъект("МойАВ");

	План.Добавить(4,"_четыре");

	Для й=0 По План.Количество()-1 Цикл
		Сообщить("Значение = "+План.Получить(й)+" имя = "+План.ПолучитьКлюч(й));
	КонецЦикла;

	Сообщить("Добавленное в обекте свойство _четыре = "+План._четыре);
	Сообщить("Добавленное в конструкторе свойсто Один = "+План.Один);
КонецПроцедуры 


Вываливается ошибка на любом из последних двух "Сообщить":
Цитата:
CSafeContextPtr : попытка обращения к указателю NULL


Во вложении сам класс и его тест.

В багзилле: http://www.1cpp.ru/bugs/show_bug.cgi?id=4258
  

MyAV.rar ( 24 KB | Загрузки )
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка при обращении к свойствам потомка АВ
Ответ #1 - 24. Декабря 2008 :: 10:00
Печать  
Ага, баг подтверждаю.
Видимо, здесь идет пересечение с первоначальным кешированием количества свойств для базового класса и последующим использованием этого количества при обращении к свойствам класса-наследника Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при обращении к свойствам потомка АВ
Ответ #2 - 24. Декабря 2008 :: 10:35
Печать  
АссоциативныйВектор не подходит для включения в иерархию наследования.
Только агрегировать можно.

Это не баг, это дизайн такой.
Это компромисс между сложностью доступа по имени свойства (достигнут const), сохранением свободы модификации содержания и дизайна контекста 1С.

Можно было бы сделать доступ O(N), либо отказаться от свободы модификации (сортировки, например).
Но первое не интересно, а второе - реализовано в структуре (объект 1cpp).
Структуру отсортировать с затратами O(N log N) невозможно.

P.S.
Кстати, скажу еще, что это проблема не дизайна АВ, а проблема дизайна контекста 1С.
Ибо контекст 1С не умеет получать значение свойства по имени свойства.
Вместо этого он умеет получать значение свойства только по номеру, определив номер для данного имени.
А как раз эта необязательная операция - для АВ - является линейно затратной.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка при обращении к свойствам потомка АВ
Ответ #3 - 24. Декабря 2008 :: 10:45
Печать  
artbear писал(а) 24. Декабря 2008 :: 10:00:
Ага, баг подтверждаю.
Видимо, здесь идет пересечение с первоначальным кешированием количества свойств для базового класса и последующим использованием этого количества при обращении к свойствам класса-наследника Печаль

Возможно.

Принципиально важно при доступе к свойствам АВ не кешировать их номера.
Т.е. корректная последовательность доступа для каждого случая:

- FindProp(LPCSTR)
- GetPropVal(int /CValue&) / SetPropVal(int, CValue const&)

В этом случае это будет совпадать со штатной последовательностью доступа со стороны 1С, и проблем не будет.


При этом FindProp возвращает некий дескриптор, хендл свойства, а вовсе не его порядковый номер.
Атипичная пневмония, так сказать.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка при обращении к свойствам потомка АВ
Ответ #4 - 24. Декабря 2008 :: 11:45
Печать  
Понял, спасибо. Так и запишем: не наследуйтесь от АВ.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать