|
Страници по тази тема: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | (покажи всички)
Тема
|
я пробвайте да компилирате това:
|
|
Автор | zaphod (Нерегистриран) |
Публикувано | 20.05.05 12:04 |
|
за мое голямо учудване, в темплейта се подменят и имената на конструктора и деструктора. при VC6.0 няма проблем, в примера по-долу се вика деструктора както е по замисъл, обаче дали и другите компилатори ще го направят така? който не го мързи да пробва. интересното е когато се сложи параметър клас, който няма деструктор - тогава пасажа с деструктора въобще не генерира код, но не дава и грешка, просто си го прескача.
class B{
public:
~B(){
printf("destructor!\n");
}
};
template<class cls>
void A(void *p){
((cls*)p)->~cls();
}
int main(int argc, char* argv[])
{
B inst;
A<B>(&inst);
}
| |
Тема
|
Я пак, че не разбрах нещо
[re: zaphod]
|
|
Автор |
Colombino (безработен) |
Публикувано | 20.05.05 13:11 |
|
Парчето код печати 2 пъти destruktor на изхода. Струва ми се нормално поведение, не схващам ти какво очакваш да стане.
Редакция:
>> клас, който няма деструктор
Те такова животно нема. Има клас с тривиален деструктор.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_Редактирано от Colombino на 20.05.05 13:28.
| |
Тема
|
Re: я пробвайте да компилирате това:
[re: zaphod]
|
|
Автор | Чвopko (Нерегистриран) |
Публикувано | 20.05.05 13:38 |
|
Вместо template<class cls>
void A(void *p){
((cls*)p)->~cls();
}
може да направиш "по-изящният" вариант:
template<class T>
void AA(T & t)
{
t.~T();
}
А иначе всичко си е нормално. Деструктора си го има, дори и ти да не си го указал. Виж асемблерския код.
Поправи ме, ако греша, но не вдявам какво точно питаш...
| |
Тема
|
Re: я пробвайте да компилирате това:
[re: zaphod]
|
|
Автор | Пeтpocян (Нерегистриран) |
Публикувано | 20.05.05 13:40 |
|
Вместо template<class cls>
void A(void *p){
((cls*)p)->~cls();
}
може да направиш "по-изящният" вариант:
template<class T>
void AA(T & t)
{
t.~T();
}
А иначе всичко си е нормално. Деструктора си го има, дори и ти да не си го указал. Виж асемблерския код.
Поправи ме, ако греша, но не вдявам какво точно питаш...
| |
|
Те такова животно нема. Има клас с тривиален деструктор.
Искаш да кажеш, че ако няма изрично дефиниран деструктор, се вика някакъв фиктивен, вмъкнат от компилатора?
| |
|
Искам да кажа, че на теория всеки клас има деструктор, бил той и празният деструктор. В тоя смисъл можеш да му извикаш деструктора дори без да е дефиниран и той ще прави нищо - няма да генерира код. Поне не в релийз, за дебъг ба ли му мамата.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
| |
Тема
|
ами очаквах
[re: Colombino]
|
|
Автор | zaphod (Нерегистриран) |
Публикувано | 20.05.05 16:18 |
|
да ми каже че няма функция ~cls(), защото такава наистина няма. другите низове cls няма да се подменят, но деструктора и конструктора явно ги търси. а иначе дали всеки клас има деструктор:
пробвай
int str;
str.~int();
и пак ще приказваме
| |
|
Пробвай тва и ми кажи има ли int деструктор, или не.
template<class cls>
void A(cls *p)
{
p->~cls();
}
int main(int argc, char* argv[])
{
int inst;
A(&inst);
}
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
| |
|
Each class has one and only one destructor. It is called, when an object of the class is
destroyed. If the programmer does not define one, the compiler defines a destructor.
The programmer has to define one, when class constructors use malloc() or new.
| |
|
Ако имаш, например, членове с деструктори това извикване ще им извика деструкторите. Забавното е, че ако нямаш, студиото дава warning за неизползвана променлива [на 4 ниво :-)]. Според мен това не е коректно, извикването на празна функция, не е неупотреба. Кво като е дефинирана служебно ...
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
| |
|
Страници по тази тема: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | (покажи всички)
|
|
|