перекрестные ссылки - страница 3

 
Dmitry Fedoseev:
POINTER_INVALID равен 0. Поэтому код !CheckPointer(element) - правильный. Только не канонический))

Так-то правильно говоришь, сам тоже так делаю. Но не дай боже разрабам, при очередном рефакторинге, придет умная мысль сделать POINTER_INVALID=-1))) По аналогии, например, с INVALID_HANDLE_VALUE

 
Dmitry Fedoseev:
В один из них можно передать динамически созданный объект, а в другой - автоматически созданный.

В оба можно и тот, и тот передать.

 
понятно. Спасибо всем )
 
Vladimir Simakov:

В оба можно и тот, и тот передать.

Не оба.

class A{
};

A a1;

void OnStart(){
   A* a2=new A();
   //f2(a1); // ошибка компиляции
   f1(a2); // компилируется, но что-то в этом не то... не знаю стоит ли так делать
   delete a2;
  }
void f1(A &arg){

}

void f2(A *arg){

}
Да и там в библиотеке имена у методов одинаковые, поэтому не получится самому решить куда что передавать, перегрузка сработает.
 
Dmitry Fedoseev:

Не оба.

class A{
};

A a1;

void OnStart(){
   A* a2=new A();
   f2(&a1); // вот так это делается
   f1(a2); // компилируется, но что-то в этом не то... не знаю стоит ли так делать
   delete a2;
  }

void f1(A &arg){
}

void f2(A *arg){
}
 
Vladimir Simakov:

Это жульничество. О том что можно получить указатель на автоматический объект знаю, и как его получить тоже знаю. Смыл в том, что есть два перегруженных метода, чтобы программист, использующий этот класс, не задумывался, что он туда передает.

 
Dmitry Fedoseev:

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

Для либы это вот так делается:

class A{
public:
   ~A(){Print("--");}
};

A a1;

void OnStart(){
   A* a2=new A();
   f2(a1); // вот так это делается
   f1(a2); // компилируется, но что-то в этом не то... не знаю стоит ли так делать
//   delete a2;
  }
void f1(A &arg){

}

void f2(A &arg){f2(&arg);}

void f2(A *arg){
 delete arg;
}
UPD: заодно и проверил, будет ли вызван деструктор автоматически созданного объекта, при вызове delete по его дескриптору. Не будет. Просто в плюсах - это ub.
 
B djn
Vladimir Simakov:

Для либы это вот так делается:

И вот тут можно обнаружить, что автоматический объект уходит в метод с &, а динамический в метод с *

 
Dmitry Fedoseev:
B djn

И вот тут можно обнаружить, что автоматический объект уходит в метод с &, а динамический в метод с *

Естественно. Для компилятора A и A*, вообще-то - два разных типа данных)))
 
Vladimir Simakov:
Естественно. Для компилятора A и A*, вообще-то - два разных типа данных)))

Вот это да! Вот это открытие!!!