LINUX.ORG.RU

Задачка для ума. Из С++, но язык значения не имеет - главное типизация


1

2

Есть функция. Она должна в списке объектов найти объект по заданым свойствам.

Что делать, если функция не нашла объект?

Бросить исключение - не хочется. Понятие пустого объекта нет.

★★★★

Ответ на: комментарий от JackyTreehorn

Там а малое один раз встречается:

B a( A(c) );

namezys ★★★★
() автор топика
Ответ на: комментарий от mi_estas

> Я с тобой согласен на все 100. Но тогда задай себе вопрос: что ты делаешь в с++?

обертываю указатели :_

namezys ★★★★
() автор топика
Ответ на: комментарий от namezys

>А я вам о чем говорю?

Если речь о том чтобы статически блокировать компиляцию программы в которой обработаны не все неудачные кейсы - то это в общем случае не решаемо и коммерчески не востребовано.

Absurd ★★★
()

всё просто, функция возвращает всегда статус Success/Error а обьект передаётся через параметры

bool func(obj& o);

mm3 ★★★
()
Ответ на: комментарий от Absurd

> то это в общем случае не решаемо и коммерчески не востребовано.

Надо к этому стремиться

namezys ★★★★
() автор топика
Ответ на: комментарий от JackyTreehorn

Я не троль и я не умничаю, я высказываю свою точку зрения. Если она у вас вызывает какие-то негативные эмоции, прошу прощения.

mi_estas
()
Ответ на: комментарий от mi_estas

> подозреваю, что у тебя слишком много времени.

нет. куча шаблонов

namezys ★★★★
() автор топика
Ответ на: комментарий от namezys

>> то это в общем случае не решаемо и коммерчески не востребовано.

Надо к этому стремиться

В условиях, когда только 10% небрежно обработанных неудачных сценариев обуславливают 90% субъективной «нестабильности» работы программы с точки зрения пользователя? Распыление сил.

Absurd ★★★
()
Ответ на: комментарий от namezys

>И иметь симантику присвоения
Как раз поэтому выше я писал о необходимости, в этом случае, оператора копирования.

Для этого объект должен быть сконструирован.

Ну да. А в чем проблема?

trex6 ★★★★★
()
Ответ на: комментарий от mi_estas

Негативные эмоции у меня вызывает то, что некоторые умники высказывают свою никому не интересную точку зрения в неподходящих для этого местах.

JackyTreehorn
()
Ответ на: комментарий от AIv

>но конструктор копирования тут не нужен
Я имел ввиду не конструктор копирования, а переопределение operator=. Хотя на практике такие вещи применяю редко, поэтому погу путать.

trex6 ★★★★★
()

> язык значения не имеет - главное типизация

Есть функция. Она должна в списке объектов найти объект по заданым свойствам.

find :: (a -> Bool) -> [a] -> Maybe a

mix_mix ★★★★★
()
Ответ на: комментарий от JackyTreehorn

Негативные эмоции у меня вызывает то, что некоторые умники высказывают свою никому не интересную точку зрения в неподходящих для этого местах.

хехе, что ж вы тогда на лоре делаете? Вам нравится получать негативные эмоции?

mi_estas
()
Ответ на: комментарий от trex6

Скорее всего класс написал то же чувак, который вставил free, и доступа к коду нет. Это всего лишь предположение.

mi_estas
()
Ответ на: комментарий от anonymous

>> А быть пустым для него - невалидное состояние

Но почему?

Потому что я имею объект и знаю что валиден

namezys ★★★★
() автор топика

Это не задачка для ума, это бег на костылях.

PolarFox ★★★★★
()
Ответ на: комментарий от namezys

Мне кажется проблема вот в чём. Если представить твою прогу в виде state machine, тогда у тебя есть состояние, которое ты пытаешься отвергнуть. Оно есть, а ты упираешься, пытаешься сделать так, что бы его не было. Так что у тебя есть два варианта: либо принять, что оно есть, либо прикинутся, что его нет. Второй случай - это просто считать, что соответсвующий объект всегда есть в списке и проблемы никогда не возникнет. Первый случай - сделать с этим что-либо. Т.е. у тебя должен быть кусок кода, который эту ситуацию обрабатывает. Механизмов для этого много разных, но каждый из них не идеален. На сколько я понял ты не можешь определится с этим моментом.

mi_estas
()
Ответ на: комментарий от JackyTreehorn

> Я не понял: тебе ни один из предложенных вариантов не подходит? Тема как-то плавно ушла в сторону.

Не. Не один. Видно решения в указанных условиях нету

namezys ★★★★
() автор топика
Ответ на: комментарий от mi_estas

> Каким образом? Мне интерестно узнать решение.

Передалал алгоритм - теперь он использует на find, а filter - а массив оъектов может быть вполне валидно пустым.

Но все равно внутри динамическое выделение памяти

namezys ★★★★
() автор топика
Ответ на: комментарий от namezys

Т.е. этот массив может быть только нулевого размера или содержать не более одного элемента? Или алгоритму надо сразу несколько объектов из списка и ты их извлекаешь «за один присест»? Если второе - то да, хорошее, годное решение.

mi_estas
()
Ответ на: комментарий от mi_estas

Сделал так, что сразу несколько извлекает за один пресест. То есть это стало допустимой ситауцией. А хотел вначале по одному извлекать

namezys ★★★★
() автор топика
Ответ на: комментарий от namezys

ВОт за это обожаю С++

 parser.cpp:295: error: no matching function for call to ‘NProviders::LangSelector<NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Detail::PartyName))), NXmlParser::Property::NotNull<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::ResourceContributor))), NXmlParser::Property::Multiple<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::Video::VideoDetailsByTerritory))), NXmlParser::Property::Multiple<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::Video::Video))), NXmlParser::Property::Multiple<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::ResourceList))), NXmlParser::Property::NotNull<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::NewReleaseMessage))), NXmlParser::Property::NotNull<NXmlParser::Property::Common>, QDomDocument, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None> >::LangSelector(const NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::ResourceContributor))), NXmlParser::Property::Multiple<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::Video::VideoDetailsByTerritory))), NXmlParser::Property::Multiple<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::Video::Video))), NXmlParser::Property::Multiple<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::ResourceList))), NXmlParser::Property::NotNull<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::NewReleaseMessage))), NXmlParser::Property::NotNull<NXmlParser::Property::Common>, QDomDocument, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None>&)’ providers/ddex/ddexparser.cpp:185: note: candidates are: NProviders::LangSelector<NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Detail::PartyName))), NXmlParser::Property::NotNull<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::ResourceContributor))), NXmlParser::Property::Multiple<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::Video::VideoDetailsByTerritory))), NXmlParser::Property::Multiple<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::Video::Video))), NXmlParser::Property::Multiple<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::ResourceList))), NXmlParser::Property::NotNull<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::NewReleaseMessage))), NXmlParser::Property::NotNull<NXmlParser::Property::Common>, QDomDocument, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None> >::LangSelector(const NProviders::LangSelector<NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Detail::PartyName))), NXmlParser::Property::NotNull<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::ResourceContributor))), NXmlParser::Property::Multiple<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::Video::VideoDetailsByTerritory))), NXmlParser::Property::Multiple<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::Video::Video))), NXmlParser::Property::Multiple<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::Resource::ResourceList))), NXmlParser::Property::NotNull<NXmlParser::Property::Common>, NXmlParser::Element<((const char*)((char*)(& NProviders::NTag::NewReleaseMessage))), NXmlParser::Property::NotNull<NXmlParser::Property::Common>, QDomDocument, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None>, NXmlParser::Value::None> >&) 
namezys ★★★★
() автор топика
Ответ на: комментарий от namezys

> А какой конструтор у него будет, если объект не найден?

Любой, тебе главное нолик валидности проставить, а все остальное, что есть в этом объекте - тебе не важно. Так что конструктор по умолчанию подойдет.

anonymous
()
Ответ на: комментарий от aho

> clang пробовал?

Пока нет. У меня чутье на такое - сразу нашел где ошибка

namezys ★★★★
() автор топика
Ответ на: комментарий от JackyTreehorn

Сайдэффект в предикате? Руки бы отрывал за такое.

anonymous
()
Ответ на: комментарий от namezys

Да, кстати, коллекция, в которой производится поиск, может быть _пустой_. Отсюда сразу следует, что если ты возвращаешь объект некоего типа, то ты обязан будешь объект этого типа сконструировать. Потому что больше тебе взять его негде. Ну или кидай исключение.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.