LINUX.ORG.RU

Возможно, это действительно кому-то понадобилось.

panter_dsd ★★★★
()
Ответ на: комментарий от Xellos
#include <iostream>

struct Foo {
   int foo;

   explicit Foo(int f) : foo(f) {}

   void bar()
   {
      if (this != 0) {
         std::cout << foo << std::endl;
      } else {
         std::cout << ";)" << std::endl;
      }
   }
};

int main(int argc, char* argv[])
{
   Foo f(33), *pF = NULL;
   f.bar();
   pF->bar();
   return 0;
}
/tmp $ g++ pew.cc 
/tmp $ ./a.out 
33
;)
yoghurt ★★★★★
()
Ответ на: комментарий от UVV

Это фича. Ходят слухи, что её даже используют, но сам я пока не встречал

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

в нормальных языках не может (java?)

В нормальных языках всё веселее:

GNU Smalltalk ready

st> Object extend [ testNil [self == nil ifTrue: ['Oops' printNl]]]
st> nil testNil
'Oops'
nil
st> Object extend [ test0 [self = 0 ifTrue: ['Oops' printNl]]]
st> 0 test0
'Oops'
0
st> 1 test0
1
yoghurt ★★★★★
()
Ответ на: комментарий от unt1tled

успакойся, это C++

Так вот я и говорю, что всё запущено. Язык, в котором можно вызвать метод из неинициализированного указателя... Мне кажется, это достойно занесения в best practices выстрелов в ногу.

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

не заметил ниодного нормального языка в этой куче символов

unt1tled ★★★★
()
MyClass::method()
{
   if (this) {
      ...
   }
}

конечно же.

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

Хотя это может привести к интересным решениям.

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

И ниговори. Где-то даже видел совет делать для этого специальный булевый мембер в классе. isInitialized.
Сам такой проблемы никогда не замечал, но теперь ненавижу это говно еще больше.

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

Сам такой проблемы никогда не замечал, но теперь ненавижу это говно еще больше.

Ну тогда тебе сразу в копилку: я встречал такое, что при создании объекта одного класса инстанцировался объект другого (одноименного) класса, определенный в соседнем объектнике. Отлаживать подобное особенно доставляет

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

Язык, в котором можно вызвать метод из неинициализированного указателя

что убирает лишние проверки. и даёт свои 5 копеек к производительности. а вызов метода по не инициализированному указателю довольно легко отслеживается.

next_time ★★★★★
()
Ответ на: комментарий от i-rinat

Напоминает башенько:

Мы обращались в фирму 1С с предложением ввести в язык (речь идет о версии 6.0) следующие конструкции :

ПОЧЕМУ БЫ И НЕ — проверяет условие еще раз (самый частый глюк старой 1С)
НЕПРЕМЕННО — выполняет оператор без сбоев и зависаний
ОТНЫНЕ — присваивает значение переменной так, чтобы оно там действительно оказалось. (присвоить переменной вида, к примеру, «Справочник» значение в языке 1С — порой очень непростая задача, иногда требующая конструкции аж из 4-х операций)
ВО ЧТО БЫ ТО НИ СТАЛО — выводит текст отчета который без этого оператора выводится через раз.
НЕ СПАТЬ — отключает внутренний глюкогенератор
Я СКАЗАЛ — выполняет команду до тех пор, пока она не выполнится.
ИМЕТЬ СОВЕСТЬ — приостановить выполнение команды при её зависании.

Почему-то фирма не прислушалась к нашему мнению..

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

напомнило одну интерпрайз поделку

if( value == true ) {
   ....
} else if( value == false ) {
   ....
} else {
    throw std::runtime_error("Bad value");
}
ossa ★★
()
Ответ на: комментарий от next_time

убирает лишние проверки
вызов метода по не инициализированному указателю довольно легко отслеживается

Так убирает - или отслеживается?

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

отслеживается фактом падения программы нахрен)

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

Легко. Если это не виртуальная функция то оно превращается в обычный вызов функции с this в качестве первого аргумента.

ranka-lee
()
Ответ на: комментарий от next_time

Синтаксически - да, безусловно. Но то, что я должен каждый раз проверять, действительно ли x это x, лично меня бесит.
То, что я нахожусь во Вселенной евклидовой геометрии, не надо каждый раз проверять, случайно? Что скорость света постоянна в инерциальной системе отсчёта? Что хиральность^W byte-order не поменялся?

Xellos ★★★★★
()

Я всех победю.

int main()
{
    https://www.linux.org.ru/forum/talks/11224032
    int a, b, c;
    return (a == 0 ? a : b) = (c < 0 ? 1 : 2);
}

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

в нормальных языках не может (java?)

Если брать андроид, то теоретически может. Внутри Activity один из методов выполняем в отдельном потоке. Во время этого активити прибивается (например, при смене ориентации), this будет указывать в пустоту.

Но это лишь мои предположения.

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

Но то, что я должен каждый раз проверять, действительно ли x это x,

на самом деле, на практике, не должен: Конкурс лучшего кода (комментарий) «Сам такой проблемы никогда не замечал»

то есть представьте ситуацию. есть SomeClass* x; если после следует x = new SomeClass; то проблемы никакой. если следует init(x), где он должен быть инициализирован, то очевидно, после функции должна идти проверка, был ли x фактически инициализирован. проверку можно провести либо сравнением с nullptr, либо перехватом исключения, в зависимости от спецификации ф-ции.

если же сразу после SomeClass* x; идёт x->func(), то, очевидно, это быдлокод. если же x инициализирован сразу после определения, то это в любом языке — источник ошибок.

next_time ★★★★★
()

А чем это не нравится? Мисье не знает, что по стандарту можно вызвать не виртуальный метод, даже если объект равен nullptr?

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

очевидно, это быдлокод

Очевидно. Но поймать конкретную ошибку может быть крайне непросто. Оно может даже немного работать, только работать оно будет странно.

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

как два пальца такую ошибку обнаружить и поймать, программа будет вылетать с завидной регулярностью

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

нет, это быдлокод дебила, который не умеет применять перегрузку операторов.

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

А чем это не нравится? Мисье не знает, что по стандарту можно вызвать не виртуальный метод, даже если объект равен nullptr?

Как раз по стандарту это UB.

Dendy ★★★★★
()

Пфф, я такое встречал в реальном коде. Написано было индусами на вижуал студии 6, а мне спустя 10 лет пришлось это отлаживать.

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