Russian Qt Forum
Ноябрь 23, 2024, 17:36
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
С/C++
>
Эмуляция null-объекта
Страниц: [
1
]
2
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Эмуляция null-объекта (Прочитано 15159 раз)
Blackwanderer
Гость
Эмуляция null-объекта
«
:
Март 16, 2012, 16:48 »
Доброго времени суток!
Есть у меня объект "Вектор" (тот, который математический, из линейной алгебры), но при создании объекта я еще не знаю, какой размерности он должен быть. В качестве заглушки я создаю вектор нулевой размерности. Проблема в том, что это некрасиво чисто с эстетической точки зрения, т.к. в линейной алгебре нет понятия вектора нулевой размерности и без дополнительных объяснений/комментариев стороннему человеку непонятно что это за зверь. Опять же использование такого объекта некорректно только с логической точки зрения. С точки зрения языка - это абсолютно обычный объект класса.
Хотелось бы иметь на случай такой заглушки своего рода null-объект, который является особым объектом и который нельзя использовать ни в каких операциях. Понимаю, что средствами языка (по крайней мере в лоб) такого не реализовать. Понимаю, что, возможно, это в принципе нельзя реализовать. И не настаиваю. Задача из разряда хотелок. Но может быть, что-нибудь интересное и удастся придумать.
P.S. Работу с указателями и NULL не предлагать. Это точно также снижает эстетичность программы (приходится писать конструкции типа
Код:
(*vector)[i]
).
Записан
mutineer
Гость
Re: Эмуляция null-объекта
«
Ответ #1 :
Март 16, 2012, 16:51 »
Я не понял задачи
Записан
Blackwanderer
Гость
Re: Эмуляция null-объекта
«
Ответ #2 :
Март 16, 2012, 16:55 »
Цитата: mutineer от Март 16, 2012, 16:51
Я не понял задачи
Хочу заведомо некорректный объект класса причем как с логической точки зрения (объект должен быть некорректен с точки зрения предметной области), так и с точки зрения языка (использование объекта должно вызывать ошибку, исключение и т.д.).
Записан
mutineer
Гость
Re: Эмуляция null-объекта
«
Ответ #3 :
Март 16, 2012, 17:27 »
Цитата: Черный Странник от Март 16, 2012, 16:55
так и с точки зрения языка (использование объекта должно вызывать ошибку, исключение и т.д.).
Использование какое? разыменование? обращение к методам? передача параметром в фукнцию?
А почему нельзя создать объект тогда, когда будет известна его размерность?
«
Последнее редактирование: Март 16, 2012, 17:29 от mutineer
»
Записан
Blackwanderer
Гость
Re: Эмуляция null-объекта
«
Ответ #4 :
Март 16, 2012, 17:38 »
Цитата: mutineer от Март 16, 2012, 17:27
Использование какое? разыменование? обращение к методам? передача параметром в фукнцию?
Ну, хотя бы обращение к методам.
Цитата: mutineer от Март 16, 2012, 17:27
А почему нельзя создать объект тогда, когда будет известна его размерность?
Потому что этот объект - поле другого, более крупного класса.
Записан
mutineer
Гость
Re: Эмуляция null-объекта
«
Ответ #5 :
Март 16, 2012, 17:40 »
Цитата: Черный Странник от Март 16, 2012, 17:38
Ну, хотя бы обращение к методам.
Сделай у него методы, которые будут ошибку генерировать:)
Цитата: Черный Странник от Март 16, 2012, 17:38
Потому что этот объект - поле другого, более крупного класса.
Ииии? Проблема-то в чем?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Эмуляция null-объекта
«
Ответ #6 :
Март 16, 2012, 17:46 »
Цитата: Черный Странник от Март 16, 2012, 16:48
Хотелось бы иметь на случай такой заглушки своего рода null-объект, который является особым объектом и который нельзя использовать ни в каких операциях.
Вряд ли Вы можете использовать в операциях хоть что-либо с некорректной размерностью (напр множить матрицу 2х2 на 3х3), Тогда к чему цебе "особый объект"? Натыкайте assert'ов - и все дела
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Эмуляция null-объекта
«
Ответ #7 :
Март 16, 2012, 17:46 »
Цитата: Черный Странник от Март 16, 2012, 16:48
Доброго времени суток!
Есть у меня объект "Вектор" (тот, который математический, из линейной алгебры), но при создании объекта я еще не знаю, какой размерности он должен быть. В качестве заглушки я создаю вектор нулевой размерности. Проблема в том, что это некрасиво чисто с эстетической точки зрения, т.к. в линейной алгебре нет понятия вектора нулевой размерности и без дополнительных объяснений/комментариев стороннему человеку непонятно что это за зверь. Опять же использование такого объекта некорректно только с логической точки зрения. С точки зрения языка - это абсолютно обычный объект класса.
Хотелось бы иметь на случай такой заглушки своего рода null-объект, который является особым объектом и который нельзя использовать ни в каких операциях. Понимаю, что средствами языка (по крайней мере в лоб) такого не реализовать. Понимаю, что, возможно, это в принципе нельзя реализовать. И не настаиваю. Задача из разряда хотелок. Но может быть, что-нибудь интересное и удастся придумать.
P.S. Работу с указателями и NULL не предлагать. Это точно также снижает эстетичность программы (приходится писать конструкции типа
Код:
(*vector)[i]
).
Как вариант: по умолчанию размерность = 1
А пустой вектор вы всё равно не сможете использовать.. компилятор не даст)
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Эмуляция null-объекта
«
Ответ #8 :
Март 16, 2012, 17:54 »
Да, кстати в плюсах уже есть нормальный вектор, с поддержкой всех мат. операций над векторами valarray
http://www.cplusplus.com/reference/std/valarray/
Посмотрите как он реализован, прежде чем своё городить)
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Blackwanderer
Гость
Re: Эмуляция null-объекта
«
Ответ #9 :
Март 16, 2012, 18:15 »
Цитата: mutineer от Март 16, 2012, 17:40
Сделай у него методы, которые будут ошибку генерировать:)
Только у одного объекта класса методы ошибку выдавать не могут. Дополнительный флаг и проверка - слишком долго. Наследование и виртуальные функции - не работает inline - слишком долго.
Цитата: mutineer от Март 16, 2012, 17:40
Ииии? Проблема-то в чем?
Объект создается
перед входом
в конструктор, а размерность известна в лучшем случае хоть и в конструкторе, но через сотню-другую инструкций. Ещё раз, проблема чисто эстетическая, на работу программы это всё никак не влияет.
Записан
Blackwanderer
Гость
Re: Эмуляция null-объекта
«
Ответ #10 :
Март 16, 2012, 18:18 »
Цитата: Igors от Март 16, 2012, 17:46
Вряд ли Вы можете использовать в операциях хоть что-либо с некорректной размерностью (напр множить матрицу 2х2 на 3х3), Тогда к чему цебе "особый объект"? Натыкайте assert'ов - и все дела
Хотелось бы что бы при взгляде на программу было сразу понятно, что это именно неккоректный вектор-заглушка. Дело в том, что сейчас вполне корректно будет умножаться матрица 0x0 на матрицу 0x0.
«
Последнее редактирование: Март 16, 2012, 18:26 от Черный Странник
»
Записан
Blackwanderer
Гость
Re: Эмуляция null-объекта
«
Ответ #11 :
Март 16, 2012, 18:19 »
Цитата: m_ax от Март 16, 2012, 17:54
Да, кстати в плюсах уже есть нормальный вектор, с поддержкой всех мат. операций над векторами valarray
http://www.cplusplus.com/reference/std/valarray/
Посмотрите как он реализован, прежде чем своё городить)
По сути мой класс - это просто оболочка над stl-контейнером, предоставляющая интерфейс в терминах предметной области.
Записан
mutineer
Гость
Re: Эмуляция null-объекта
«
Ответ #12 :
Март 16, 2012, 18:26 »
Цитата: Черный Странник от Март 16, 2012, 18:15
Цитата: mutineer от Март 16, 2012, 17:40
Сделай у него методы, которые будут ошибку генерировать:)
Только у одного объекта класса методы ошибку выдавать не могут. Дополнительный флаг и проверка - слишком долго. Наследование и виртуальные функции - не работает inline - слишком долго.
Цитата: mutineer от Март 16, 2012, 17:40
Ииии? Проблема-то в чем?
Объект создается
перед входом
в конструктор, а размерность известна в лучшем случае хоть и в конструкторе, но через сотню-другую инструкций. Ещё раз, проблема чисто эстетическая, на работу программы это всё никак не влияет.
Ну так сделай поле указателем и создавай объект именно там, где нужно
Записан
Blackwanderer
Гость
Re: Эмуляция null-объекта
«
Ответ #13 :
Март 16, 2012, 18:28 »
Цитата: mutineer от Март 16, 2012, 18:26
Ну так сделай поле указателем и создавай объект именно там, где нужно
См. P.S. Решаем одну эстетическую проблему, получаем другую.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Эмуляция null-объекта
«
Ответ #14 :
Март 16, 2012, 18:32 »
Цитата: Черный Странник от Март 16, 2012, 18:18
Хотелось бы что бы при взгляде на программу было сразу понятно, что это именно неккоректный вектор-заглушка. Дело в том, что сейчас вполне корректно будет умножаться матрица 0x0 на матрицу 0x0.
Тогда можно попереливать из пустого в порожнее, напр
Код
C++ (Qt)
typedef
Vector TEmptyVec
;
Так нередко делают именно из-за соображений читабельности, чтобы написать TEmptyVec где надо
Записан
Страниц: [
1
]
2
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...