Russian Qt Forum
Октябрь 02, 2024, 09:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Эмуляция null-объекта  (Прочитано 15012 раз)
Blackwanderer
Гость
« : Март 16, 2012, 16:48 »

Доброго времени суток!
Есть у меня объект "Вектор" (тот, который математический, из линейной алгебры), но при создании объекта я еще не знаю, какой размерности он должен быть. В качестве заглушки я создаю вектор нулевой размерности. Проблема в том, что это некрасиво чисто с эстетической точки зрения, т.к. в линейной алгебре нет понятия вектора нулевой размерности и без дополнительных объяснений/комментариев стороннему человеку непонятно что это за зверь. Опять же использование такого объекта некорректно только с логической точки зрения. С точки зрения языка - это абсолютно обычный объект класса.
Хотелось бы иметь на случай такой заглушки своего рода null-объект, который является особым объектом и который нельзя использовать ни в каких операциях. Понимаю, что средствами языка (по крайней мере в лоб) такого не реализовать. Понимаю, что, возможно, это в принципе нельзя реализовать. И не настаиваю. Задача из разряда хотелок. Но может быть, что-нибудь интересное и удастся придумать.
P.S. Работу с указателями и NULL не предлагать. Это точно также снижает эстетичность программы (приходится писать конструкции типа
Код:
(*vector)[i]
).
Записан
mutineer
Гость
« Ответ #1 : Март 16, 2012, 16:51 »

Я не понял задачи
Записан
Blackwanderer
Гость
« Ответ #2 : Март 16, 2012, 16:55 »

Я не понял задачи
Хочу заведомо некорректный объект класса причем как с логической точки зрения (объект должен быть некорректен с точки зрения предметной области), так и с точки зрения языка (использование объекта должно вызывать ошибку, исключение и т.д.).
Записан
mutineer
Гость
« Ответ #3 : Март 16, 2012, 17:27 »

так и с точки зрения языка (использование объекта должно вызывать ошибку, исключение и т.д.).

Использование какое? разыменование? обращение к методам? передача параметром в фукнцию?

А почему нельзя создать объект тогда, когда будет известна его размерность?
« Последнее редактирование: Март 16, 2012, 17:29 от mutineer » Записан
Blackwanderer
Гость
« Ответ #4 : Март 16, 2012, 17:38 »

Использование какое? разыменование? обращение к методам? передача параметром в фукнцию?
Ну, хотя бы обращение к методам.

А почему нельзя создать объект тогда, когда будет известна его размерность?
Потому что этот объект - поле другого, более крупного класса.
Записан
mutineer
Гость
« Ответ #5 : Март 16, 2012, 17:40 »

Ну, хотя бы обращение к методам.

Сделай у него методы, которые будут ошибку генерировать:)

Потому что этот объект - поле другого, более крупного класса.
Ииии? Проблема-то в чем?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Март 16, 2012, 17:46 »

Хотелось бы иметь на случай такой заглушки своего рода null-объект, который является особым объектом и который нельзя использовать ни в каких операциях.
Вряд ли Вы можете использовать в операциях хоть что-либо с некорректной размерностью (напр множить матрицу 2х2 на 3х3), Тогда к чему цебе "особый объект"? Натыкайте assert'ов - и все дела
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #7 : Март 16, 2012, 17:46 »

Доброго времени суток!
Есть у меня объект "Вектор" (тот, который математический, из линейной алгебры), но при создании объекта я еще не знаю, какой размерности он должен быть. В качестве заглушки я создаю вектор нулевой размерности. Проблема в том, что это некрасиво чисто с эстетической точки зрения, т.к. в линейной алгебре нет понятия вектора нулевой размерности и без дополнительных объяснений/комментариев стороннему человеку непонятно что это за зверь. Опять же использование такого объекта некорректно только с логической точки зрения. С точки зрения языка - это абсолютно обычный объект класса.
Хотелось бы иметь на случай такой заглушки своего рода null-объект, который является особым объектом и который нельзя использовать ни в каких операциях. Понимаю, что средствами языка (по крайней мере в лоб) такого не реализовать. Понимаю, что, возможно, это в принципе нельзя реализовать. И не настаиваю. Задача из разряда хотелок. Но может быть, что-нибудь интересное и удастся придумать.
P.S. Работу с указателями и NULL не предлагать. Это точно также снижает эстетичность программы (приходится писать конструкции типа
Код:
(*vector)[i]
).


Как вариант: по умолчанию размерность = 1

А пустой вектор вы всё равно не сможете использовать.. компилятор не даст)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #8 : Март 16, 2012, 17:54 »

Да, кстати в плюсах уже есть нормальный вектор, с поддержкой всех мат. операций над векторами valarray http://www.cplusplus.com/reference/std/valarray/

Посмотрите как он реализован, прежде чем своё городить)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Blackwanderer
Гость
« Ответ #9 : Март 16, 2012, 18:15 »

Сделай у него методы, которые будут ошибку генерировать:)
Только у одного объекта класса методы ошибку выдавать не могут. Дополнительный флаг и проверка - слишком долго. Наследование и виртуальные функции - не работает inline - слишком долго.

Ииии? Проблема-то в чем?
Объект создается перед входом в конструктор, а размерность известна в лучшем случае хоть и в конструкторе, но через сотню-другую инструкций. Ещё раз, проблема чисто эстетическая, на работу программы это всё никак не влияет.
Записан
Blackwanderer
Гость
« Ответ #10 : Март 16, 2012, 18:18 »

Вряд ли Вы можете использовать в операциях хоть что-либо с некорректной размерностью (напр множить матрицу 2х2 на 3х3), Тогда к чему цебе "особый объект"? Натыкайте assert'ов - и все дела
Хотелось бы что бы при взгляде на программу было сразу понятно, что это именно неккоректный вектор-заглушка. Дело в том, что сейчас вполне корректно будет умножаться матрица 0x0 на матрицу 0x0.
« Последнее редактирование: Март 16, 2012, 18:26 от Черный Странник » Записан
Blackwanderer
Гость
« Ответ #11 : Март 16, 2012, 18:19 »

Да, кстати в плюсах уже есть нормальный вектор, с поддержкой всех мат. операций над векторами valarray http://www.cplusplus.com/reference/std/valarray/

Посмотрите как он реализован, прежде чем своё городить)

По сути мой класс - это просто оболочка над stl-контейнером, предоставляющая интерфейс в терминах предметной области.
Записан
mutineer
Гость
« Ответ #12 : Март 16, 2012, 18:26 »

Сделай у него методы, которые будут ошибку генерировать:)
Только у одного объекта класса методы ошибку выдавать не могут. Дополнительный флаг и проверка - слишком долго. Наследование и виртуальные функции - не работает inline - слишком долго.

Ииии? Проблема-то в чем?
Объект создается перед входом в конструктор, а размерность известна в лучшем случае хоть и в конструкторе, но через сотню-другую инструкций. Ещё раз, проблема чисто эстетическая, на работу программы это всё никак не влияет.

Ну так сделай поле указателем и создавай объект именно там, где нужно
Записан
Blackwanderer
Гость
« Ответ #13 : Март 16, 2012, 18:28 »

Ну так сделай поле указателем и создавай объект именно там, где нужно
См. P.S. Решаем одну эстетическую проблему, получаем другую.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Март 16, 2012, 18:32 »

Хотелось бы что бы при взгляде на программу было сразу понятно, что это именно неккоректный вектор-заглушка. Дело в том, что сейчас вполне корректно будет умножаться матрица 0x0 на матрицу 0x0.
Тогда можно попереливать из пустого в порожнее, напр
Код
C++ (Qt)
typedef Vector TEmptyVec;
 
Так нередко делают именно из-за соображений читабельности, чтобы написать TEmptyVec где надо
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.086 секунд. Запросов: 23.