почему this - указатель, а не ссылка?
От: ssm Россия  
Дата: 18.03.05 09:55
Оценка:
Собственно сабж.
Re: почему this - указатель, а не ссылка?
От: Lorenzo_LAMAS  
Дата: 18.03.05 10:05
Оценка: 6 (2) +1
ssm>Собственно сабж.

Я чего-то вехи забыл. Ссылочные типы в С++ изначально были? Или нет? Просто может его придумали, когда еще ссылок не было? Кроме того, this это же r-value.
Of course, the code must be complete enough to compile and link.
Re: почему this - указатель, а не ссылка?
От: fulltick  
Дата: 18.03.05 10:10
Оценка: 7 (2) +1
Здравствуйте, ssm, Вы писали:

ssm>Собственно сабж.

Зато можно написать
delete this
Re[2]: почему this - указатель, а не ссылка?
От: LuciferMoscow Россия  
Дата: 18.03.05 10:12
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Я чего-то вехи забыл. Ссылочные типы в С++ изначально были? Или нет? Просто может его придумали, когда еще ссылок не было? Кроме того, this это же r-value.

Прямо в точку. Ссылки появились позднее!
Re[3]: почему this - указатель, а не ссылка?
От: Lorenzo_LAMAS  
Дата: 18.03.05 10:19
Оценка:
LM>Прямо в точку. Ссылки появились позднее!

В "Дизайне и эволюции C++" есть что-нить по этому поводу? (время появления ссылок)
Of course, the code must be complete enough to compile and link.
Re[4]: почему this - указатель, а не ссылка?
От: LuciferMoscow Россия  
Дата: 18.03.05 10:21
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

LM>>Прямо в точку. Ссылки появились позднее!


L_L>В "Дизайне и эволюции C++" есть что-нить по этому поводу? (время появления ссылок)

Вроде есть. Иначе откуда бы я знал, что ссылки появились позднее?!
Re[5]: почему this - указатель, а не ссылка?
От: Lorenzo_LAMAS  
Дата: 18.03.05 10:23
Оценка:
LM>Вроде есть. Иначе откуда бы я знал, что ссылки появились позднее?!

Нууу, есть же люди которые на K&R C писали
Of course, the code must be complete enough to compile and link.
Re[2]: почему this - указатель, а не ссылка?
От: jazzer Россия Skype: enerjazzer
Дата: 18.03.05 12:06
Оценка:
Здравствуйте, fulltick, Вы писали:

F>Здравствуйте, ssm, Вы писали:


ssm>>Собственно сабж.

F>Зато можно написать
F>
F>delete this
F>

ну так можно написать и delete *this.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: почему this - указатель, а не ссылка?
От: Leshi Россия  
Дата: 18.03.05 12:20
Оценка:
Здравствуйте, jazzer, Вы писали:

ssm>>>Собственно сабж.

F>>Зато можно написать
F>>
F>>delete this
F>>

J>ну так можно написать и delete *this.
А плохо от такого не будет?
Я думаю, все-таки имелось в виду одно из двух:
1. ПисАть можно, но компилиться не будет.
2. Можно было бы писАть, если бы this был ссылно, но delete &this
... << RSDN@Home 1.1.3 stable >>
Re[3]: почему this - указатель, а не ссылка?
От: Leshi Россия  
Дата: 18.03.05 12:20
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

L_L>>Я чего-то вехи забыл. Ссылочные типы в С++ изначально были? Или нет? Просто может его придумали, когда еще ссылок не было? Кроме того, this это же r-value.

LM>Прямо в точку. Ссылки появились позднее!
Что-то мне подсказывает, что в TC 2.0 (задолго до С++) я уже использовал ссылки... Или я все-таки не прав?
... << RSDN@Home 1.1.3 stable >>
Re[4]: почему this - указатель, а не ссылка?
От: Lorenzo_LAMAS  
Дата: 18.03.05 12:44
Оценка:
L>Что-то мне подсказывает, что в TC 2.0 (задолго до С++) я уже использовал ссылки... Или я все-таки не прав?

Задолго до С++ == это ты еще в 70х писал и использовал TC 2.0 ?????
Of course, the code must be complete enough to compile and link.
Re[5]: почему this - указатель, а не ссылка?
От: Leshi Россия  
Дата: 18.03.05 12:54
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L>>Что-то мне подсказывает, что в TC 2.0 (задолго до С++) я уже использовал ссылки... Или я все-таки не прав?

L_L>Задолго до С++ == это ты еще в 70х писал и использовал TC 2.0 ?????
Нет, в 70х меня только проектировали. Но ТС 2.0 это начало 80-х. Если память моя не глючит, С++ в то время даже под стол пешком не ходил.
... << RSDN@Home 1.1.3 stable >>
Re[6]: почему this - указатель, а не ссылка?
От: Lorenzo_LAMAS  
Дата: 18.03.05 13:02
Оценка:
вроде как 79-80 год рождения С++ (хотя вроде как доступен массам он стал только с 85)
Of course, the code must be complete enough to compile and link.
Re[4]: почему this - указатель, а не ссылка?
От: jazzer Россия Skype: enerjazzer
Дата: 18.03.05 13:04
Оценка:
Здравствуйте, Leshi, Вы писали:

L>Здравствуйте, jazzer, Вы писали:


ssm>>>>Собственно сабж.

F>>>Зато можно написать
F>>>
F>>>delete this
F>>>

J>>ну так можно написать и delete *this.
L>А плохо от такого не будет?
L>Я думаю, все-таки имелось в виду одно из двух:
L>1. ПисАть можно, но компилиться не будет.
L>2. Можно было бы писАть, если бы this был ссылно, но delete &this

да, второе, конечно же
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: почему this - указатель, а не ссылка?
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 18.03.05 13:38
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>>>Прямо в точку. Ссылки появились позднее!


L_L>>В "Дизайне и эволюции C++" есть что-нить по этому поводу? (время появления ссылок)

LM>Вроде есть. Иначе откуда бы я знал, что ссылки появились позднее?!

Точно есть — именно это там и написано.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re: почему this - указатель, а не ссылка?
От: rus blood Россия  
Дата: 18.03.05 13:43
Оценка: 1 (1)
Здравствуйте, ssm, Вы писали:

Потому что this может быть NULL-ом.
Смотрите код CWnd::GetSafeHwnd() для примера.
Имею скафандр — готов путешествовать!
Re[2]: почему this - указатель, а не ссылка?
От: Аноним  
Дата: 18.03.05 13:53
Оценка: +2
RB>Потому что this может быть NULL-ом.
RB>Смотрите код CWnd::GetSafeHwnd() для примера.

ИМХО у нормальных людей this NULL-ом не бывает
Re[3]: почему this - указатель, а не ссылка?
От: Leshi Россия  
Дата: 18.03.05 14:09
Оценка:
Здравствуйте, <Аноним>, Вы писали:

RB>>Потому что this может быть NULL-ом.

RB>>Смотрите код CWnd::GetSafeHwnd() для примера.

А>ИМХО у нормальных людей this NULL-ом не бывает

А что делать ненормальным?
... << RSDN@Home 1.1.3 stable >>
Re[4]: почему this - указатель, а не ссылка?
От: Аноним  
Дата: 18.03.05 14:12
Оценка:
L>А что делать ненормальным?
Задуматься, с чего это у них this == 0
Re[4]: почему this - указатель, а не ссылка?
От: Аноним  
Дата: 18.03.05 14:21
Оценка:
L>А плохо от такого не будет?

если отвлечься от явной ненужности такого кода, вполне можно написать

class A
{
public:
   operator A *()
   {return this;}
   void fun(){delete *this;}
};
Re[5]: почему this - указатель, а не ссылка?
От: rus blood Россия  
Дата: 18.03.05 14:33
Оценка:
Здравствуйте, Аноним, Вы писали:

L>>А что делать ненормальным?

А>Задуматься, с чего это у них this == 0

VC позволяет вызвать метод класса, если он не виртуацльный, через нулевой указатель.
class A
{
public:
    void Method()
    {
        void* p = this;
    }
};

int main()
{
    A* a = NULL;
    a->Method();
    return 0;
}


ЗЫ
Наверно так исторически сложилось.
В M$ работает много индусов, среди которых не принято проверять укзатели, коды возвратов и пр.
Имею скафандр — готов путешествовать!
Re[5]: про delete this
От: LuciferMoscow Россия  
Дата: 18.03.05 14:38
Оценка:
я например, subj присал.

class TreeItem
{
public:
 TreeItem* m_pRightHand;
 TreeItem* m_pLeftHand;
 void KillSubTree()
 {
   if ( pRightHand )pRightHand->KillSubTree();
   if ( pLeftHand  )pLeftHand->KillSubTree();
   delete this;
 };
};
Re[5]: почему this - указатель, а не ссылка?
От: Leshi Россия  
Дата: 18.03.05 14:39
Оценка:
Здравствуйте, <Аноним>, Вы писали:


L>>А плохо от такого не будет?

А>если отвлечься от явной ненужности такого кода, вполне можно написать
А>
А>class A
А>{
А>public:
А>   operator A *()
А>   {return this;}
А>   void fun(){delete *this;}
А>};
А>

Написать можно. Но что будет? Имхо будет плохо. Это не так давно обсуждалось, только я так и не проникся, к чему же все-таки такое приведет?
... << RSDN@Home 1.1.3 stable >>
Re[6]: почему this - указатель, а не ссылка?
От: Аноним  
Дата: 18.03.05 14:39
Оценка:
RB>VC позволяет вызвать метод класса, если он не виртуацльный, через нулевой указатель.

Дак это известно. А идея про подлых индусов
Re[7]: почему this - указатель, а не ссылка?
От: rus blood Россия  
Дата: 18.03.05 14:40
Оценка:
Здравствуйте, Аноним, Вы писали:

>А идея про подлых индусов


Другой причины для функций типа GetSafeHwnd я не вижу...
Имею скафандр — готов путешествовать!
Re[2]: почему this - указатель, а не ссылка?
От: Вадим Никулин Россия Здесь
Дата: 18.03.05 14:45
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, ssm, Вы писали:


RB>Потому что this может быть NULL-ом.

RB>Смотрите код CWnd::GetSafeHwnd() для примера.

Так и знал, что к этому придет ПОИСК рулит! Undefined behavior! Млин.
Re: почему this - указатель, а не ссылка?
От: Аноним  
Дата: 18.03.05 14:46
Оценка: 1 (1)
ssm>Собственно сабж.

в те времена когда деревья были маленькими програмист сам мог выделять память для обьекта в конструкторе. Позже эту лавочку рпикрыли
Re[6]: про delete this
От: Leshi Россия  
Дата: 18.03.05 14:49
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>я например, subj присал.


LM>
LM>class TreeItem
LM>{
LM>public:
LM> TreeItem* m_pRightHand;
LM> TreeItem* m_pLeftHand;
LM> void KillSubTree()
LM> {
LM>   if ( pRightHand )pRightHand->KillSubTree();
LM>   if ( pLeftHand  )pLeftHand->KillSubTree();
LM>   delete this;
LM> };
LM>};
LM>

с таким кодом надо быть осторожнее... А если TreeItem будет объявлен так:
class Tree
{
public:
    TreeItem root;
}

То вызов KillSubTree хорошего ничего не сделает, это уж точно. Я бы сказал, что это плохая идея.
... << RSDN@Home 1.1.3 stable >>
Re[7]: про delete this
От: LuciferMoscow Россия  
Дата: 18.03.05 14:57
Оценка:
Здравствуйте, Leshi, Вы писали:
L>То вызов KillSubTree хорошего ничего не сделает, это уж точно. Я бы сказал, что это плохая идея.
Там был более сложный пример на эту тему. Но прога доблестно работает и по сей момент
Re[7]: про delete this
От: ssm Россия  
Дата: 18.03.05 15:09
Оценка:
Здравствуйте, Leshi, Вы писали:

L>с таким кодом надо быть осторожнее... А если TreeItem будет объявлен так:

L>
TreeItem root;
L>


Да чего осторожничать? Закрыть все конструкторы и сделать производящую функцию/фабрику-шмабрику
Re[8]: про delete this
От: Leshi Россия  
Дата: 18.03.05 15:29
Оценка:
Здравствуйте, ssm, Вы писали:

L>>с таким кодом надо быть осторожнее... А если TreeItem будет объявлен так:

L>>
ssm>TreeItem root;
L>>

ssm>Да чего осторожничать? Закрыть все конструкторы и сделать производящую функцию/фабрику-шмабрику
Мне кажется, что такой подход в данном случае не оправдан. Убийство поддерева можно было и в деструктор повесить. Да и кода меньше было бы, и читабельность повыше... Хотя, конечно, это могло быть обусловлено другими требованиями. Но я бы так все-равно делать не стал.
... << RSDN@Home 1.1.3 stable >>
Re[5]: почему this - указатель, а не ссылка?
От: srggal Украина  
Дата: 18.03.05 16:09
Оценка:
Здравствуйте, <Аноним>, Вы писали:


L>>А плохо от такого не будет?


А>если отвлечься от явной ненужности такого кода, вполне можно написать


А>
А>class A
А>{
А>public:
А>   operator A *()
А>   {return this;}
А>   void fun(){delete *this;}
А>};
А>


Почему же сразу и ненужности, а как насчет реализации класса с подсчетом ссылок
... << RSDN@Home 1.1.3 stable >>
Re[6]: почему this - указатель, а не ссылка?
От: _wqwa США  
Дата: 19.03.05 15:07
Оценка:
Здравствуйте, Leshi, Вы писали:

L>Здравствуйте, Lorenzo_LAMAS, Вы писали:


L>>>Что-то мне подсказывает, что в TC 2.0 (задолго до С++) я уже использовал ссылки... Или я все-таки не прав?

L_L>>Задолго до С++ == это ты еще в 70х писал и использовал TC 2.0 ?????
L>Нет, в 70х меня только проектировали. Но ТС 2.0 это начало 80-х. Если память моя не глючит, С++ в то время даже под стол пешком не ходил.
Нет, не начало... 88-й вроде... Или 89-й.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Кто здесь?!
Re[7]: почему this - указатель, а не ссылка?
От: Leshi Россия  
Дата: 20.03.05 07:49
Оценка:
Здравствуйте, _wqwa, Вы писали:

L>>>>Что-то мне подсказывает, что в TC 2.0 (задолго до С++) я уже использовал ссылки... Или я все-таки не прав?

L_L>>>Задолго до С++ == это ты еще в 70х писал и использовал TC 2.0 ?????
L>>Нет, в 70х меня только проектировали. Но ТС 2.0 это начало 80-х. Если память моя не глючит, С++ в то время даже под стол пешком не ходил.
_>Нет, не начало... 88-й вроде... Или 89-й.
Эх, не нашел такого раритета у себя. Вот ВС++ 3.1 датирован 92 годом Из этого можно предтоложить, что ТС++ 3.0 был в году этак 90-91, а вот ТС 2.0 думаю, что все-таки не позже 85 (уж очень много там изменилось) Хотя, чисто теоретически, он мог выйти и в 92, только чуть-раньше Однако, я не думаю, что его успели бы сертифицировать для военных нужд к тому времени. Это обычно 3-5 лет занимает, а я точно знаю, что в 93 он уже был сертефицирован и какое-то время уже использовался.

2All: Может быть кто-нибудь раскопает ТС 2.0 у себя в архивах да посмотрит? Уже самому итересно стало
... << RSDN@Home 1.1.3 stable >>
Re[8]: почему this - указатель, а не ссылка?
От: Privalov  
Дата: 20.03.05 09:43
Оценка:
Здравствуйте, Leshi, Вы писали:

L>2All: Может быть кто-нибудь раскопает ТС 2.0 у себя в архивах да посмотрит? Уже самому итересно стало


TC 2.0 датирован 1988 годом, imho. TC++ 1.0 — где-то 1989 (во всяком случае, в конце 1989 г. видел его IDE).
а вот TC++ 3.0, imho, сильно урезанный BC++ 3.x (нет IDE для Windows и много чего еще). Кстати, и в обзорах тогда я его не встречал.
Откровенно говоря, совершенно не помню, были ли уже ссылки в TC++ 1.0.
Re[4]: почему this - указатель, а не ссылка?
От: emusic Франция https://software.muzychenko.net/ru
Дата: 20.03.05 10:43
Оценка: +3
Здравствуйте, Leshi, Вы писали:

L>Что-то мне подсказывает, что в TC 2.0 (задолго до С++) я уже использовал ссылки...


Никаких ссылок в TC 2.0 не было и быть не могло — это ж классический ANSI C
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.