(C++) Нулевой указатель на объект

Тема в разделе "LANGS.C", создана пользователем Asvald, 24 фев 2007.

Статус темы:
Закрыта.
  1. Aquila

    Aquila Самурай дзена

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    1.467
    Адрес:
    Russia, Moscow
    Строго говоря, вопросам по лабораторным работам независимо от языка, в них использующимся, место в .BEGINNERS в специально созданной для этого теме.
     
  2. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Aquila,
    я про эту тему и имел ввиду. но почему-то в плане вопросов по C/С++ люди в подавляющем большинстве создают новый топик, а не отписываются в этой упомянутой выше и мною и вами теме. каюсь, я сам так поступал пару раз.
    хотя, если вдуматься, то ведь необязательно предполагаемый к постингу вопрос обязан быть связан с лабораторными работами. может быть как раз поэтому и создаются вышеупомянутые отдельные C/C++ related топики (топикстартер рассуждает так: у меня это не лаба, а просто вопрос. так? так. значит создаем новый топик, т.к. тот топик посвящен _только_ лабам).
    я ничего не хочу доказать, я лишь рассуждаю, и могу быть неправ.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Действительно, не помешало бы создать подфорум про С/С++.
     
  4. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    угу, подфорум был бы в самый раз. я бы тогда наверно счастлив был как не знаю кто. и все бы с/с++ related топики туда бы перенесли.
    но я != большинство, посему ждем мнения других участников форума, и ,конечно же, модераторов. Aquila отписался, и это уже хорошо:))
     
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    я всеми имеющимися руками за! а еще предлагаю завести ветку, посвященную C# и .NET...
     
  6. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    не дай Боже, эта зараза ещё сюда попадёт!
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Не более, чем другим офлуднённым или обофтопенным топикам. Вообще же, историческое место вопросов о С++ в .ZEN или .WIN32.
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ну не Java ведь все-таки!

    IceStudent
    только темы почему-то создают здесь
     
  9. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Nouzui, как по мне, так дотнет и иже с ним - гнилая ветвь развития.
    Асм и с++ - процветающая!
     
  10. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    поживем - увидим ;) сейчас рано говорить
    Java пока вроде жива.. хотя и не вытеснила все прочие языки, как об этом кричали с десяток лет назад
     
  11. Aquila

    Aquila Самурай дзена

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    1.467
    Адрес:
    Russia, Moscow
    C# и .NET - однозначно нет, так как это высокоуровневая ересь :). В лучшем случае - форума по исследованию байт-кода и виртуальных машин в неопределённом будущем.
     
  12. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    я предполагал, что начнутся "предложения" и по си-шарпу, и по яве (спасибо, визуал-бэйсика нету). че-то я теперь даже не уверен, что моя затея будет одобрена:dntknw:

    IceStudent, было дело, мой топик, связанный с Си++ вопросом, модераторы и переносили из .ZEN в .HEAP.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Aquila
    А вот про Сишник было бы кстати )
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    varnie
    Исправил эту несправедливость :) Тому топу однозначно не место в хипе.
     
  15. Shimomochi

    Shimomochi New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2007
    Сообщения:
    9
    хорошая задумка создать отдельный форум по языкам программирования. полностью поддерживаю.
    по поводу сабжа - не вижу ничего удивительного в том, что это работает.
    Фишка вот в чем:
    1. сам объект не создается
    2. класс, это тип данных + область видимости для своих ф-ций
    3. вызов (*p).F1(); - есть лишь обычный вызов обычной ф-ции в области имен класса
    4. поэтому попытка работать с членами данными класса естественно вызовет access violation

    Поэтому работа (*p).F1(); не должна вызывать удивления, т.к. это всего лишь вызов ф-ции. Невозможность вызова через CT::F1(); является стандартной и в комментариях не нуждается. Вот детальная информация, которая поможет вам понять, что происходит:

    CT* p = 0;
    0041159E mov dword ptr [p],0
    (*p).F1(); //На консоль выводится CT::F1
    004115A5 mov ecx,dword ptr [p]
    004115A8 call CT::F1 (4110DCh)

    --------------------------------------------
    &p -> 0x0012FF60

    0x0012FF60 00 00 00 00 cc cc cc cc b8 ff 12 00 66 27 41 00 01

    Полагаю, вопрос закрыт =)
     
  16. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    Nouzui
    Хм, а чем тебе Ява так не понравилась? Тоже вид ассемблера, хоть и под виртуальную машину..
     
  17. Shimomochi

    Shimomochi New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2007
    Сообщения:
    9
    И, кстати, опять возвращаясь к сабжу, хочу еще добавить один момент. Используя упомянутую автором странность (для неискушенного) в поведении С++, можно проверять понимание природы С++ у человека ;) Например задав следующий вопрос: можно ли и если можно, то как, вызвать регулярную не-статическую функцию-член класса, не используя при этом какие либо объекты (в т.ч. не создавая объект самого этого класса)? На данный момент ответ только один и единственный: да, можно, при помощи нулевого указателя - (*obj_ptr).Func(); Что эквивалентно запрещенной конструкции A::Func();

    Единственное, что меня беспокоит, это - не подвергается ли здесь насилию сам синтаксис С++?
     
  18. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Shimomochi

    Ты где такую траву берешь? :)))))))

    А при помощи ненулевого нельзя? :))

    И давно это Вас беспокоит? Хотите об этом поговорить? :))))
     
  19. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    Для невиртуальных функций адрес известен уже на этапе компиляции, поэтому компилятор вставляет код для вызова этой функции исходя из типа объекта или типа указателя независимо от его содержания. При вызове виртуальной функции на стадии компиляции ее адрес условно неизвестен(зависит непосредственно от объекта), поэтому он берется в рантайме из таблицы виртуальных функций, на которую ссылается первый дворд объекта. Но это все детали реализации и по сути никак не связано с "пониманием природы С++", так как реализация может меняться, может быть(это просто для примера) в следующих версиях С++ будут создаваться таблицы и для невиртуальных функций и все вызовы будут идти через них, но на "природу С++ это не повлияет", если конечно не вызвать функции через нулевые указатели, которые в данном случае уже работать не будут. Так что естественно таких вещей надо избегать и уж тем более не ориентироваться на них при понимании природы С++.
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    если функция использует указатель this как либо, то будет такое... )
     
Статус темы:
Закрыта.