JavaScript: передача ссылки на объект в объект-функцию

Тема в разделе "WASM.HEAP", создана пользователем _DEN_, 25 окт 2011.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Привет. Что-то не разобраться с простейшей проблемой:

    Вариант 1:
    Код (Text):
    1. for(var n = 0; n < 10; ++n)
    2. {
    3.     save_function(function() { alert(n); });
    4. }
    Вариант 2:
    Код (Text):
    1. for(var n = 0; n < 10; ++n)
    2. {
    3.     var obj = new someClass();
    4.     save_function(function() { alert(obj); });
    5. }
    Судя по всему, name lookup происходит только в момент вызова объекта-функции, а не в момент его описания. Из-за этого в первом варианте все 10 функций выведут "10", а во втором - все 10 функций будут ссылаться на один и тот же объект, созданый на последней итерации. А мне нужно, чтобы в функцию передались те объекты, которые существовали в текущей итерации. Как это можно сделать?

    Спасибо.
     
  2. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Передача ссылки на объект в функтор на C++:

    Код (Text):
    1. class Test
    2. {
    3. };
    4.  
    5. class Functor
    6. {
    7. public:
    8. void operator()(Test& rObject)
    9.    {
    10.       //Actions;
    11.    }  
    12. };
    13.  
    14. int main()
    15. {
    16. Functor()(Test());
    17. return(0);
    18. }
     
  3. _DEN_

    _DEN_ DEN

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

    Дружище, ты вообще как, адекватен? То пишешь вопросы про асм в топиках, посвященных обсуждению научной статьи, то теперь пишешь решение на C++, когда требуется JavaScript. Поверь, мне ты совершенно ничего нового про C++ не способен рассказать впринципе, так что побереги силы.

    PS. Проблема решена, тему можно закрыть, или грохнуть.
     
  4. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    _DEN_
    Ошибаешься. Думаешь ты глубоко знаешь С++? Попробуй решить загадку. Один обычный указатель присваивается второму (pointer1 = pointer2;). В каком случае после присваивания pointer1 не будет равен pointer2? Ну?
     
  5. Clickgg

    Clickgg New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2011
    Сообщения:
    32
    *pointer=++*pointer2; не?
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Пожалуйста, уведите кто-нибудь нафаню, а то я его сейчас ударю.
     
  7. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    _DEN_, можно попробовать вариант подставлять объект-функцию не напрямую, а через eval, подставляя в eval строку с кодом функции таким, чтоб переменные в нужных местах уже были заменены на уже вычисленные литералы:

    Код (Text):
    1. for(var n = 0; n < 10; ++n)
    2. {
    3.    eval("save_function(function() { alert(" + n + "); })") ;
    4. }
    или так (более читаемо):

    Код (Text):
    1. for(var n = 0; n < 10; ++n)
    2. {
    3.    var f;
    4.    eval("f=function() { alert(" + n + "); }") ;
    5.    save_function(f);
    6. }
     
  8. int_256

    int_256 New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2009
    Сообщения:
    11
    за евал в таких простых кодах руки отбивать надо
     
  9. _DEN_

    _DEN_ DEN

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

    Проблема уже решена. В функцию нужно просто добавить поле, а потом обратиться к нему внутри функции через arguments.callee
     
  10. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Nafanya
    Про указатели у меня есть только вариант с частичным перекрытием занимаемой ими памяти:
    Код (Text):
    1. union {
    2. struct{char c; void *p;} a;
    3. struct{void *p; char c; } b;
    4. } u;
    5. u.a.p=u.b.p;
    а другие решения как выглядят?
     
  11. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Black_mirror
    Мудрёно:)

    Имелся ввиду реальный код, в котором имеется строка, присваивающая указатели:
    Код (Text):
    1. void Func()
    2. {
    3. //...
    4. pointer1 = pointer2;
    5. cout << pointer1 << "  " << pointer2 << endl;
    6. }
    На что должны указывать pointer1 и pointer2, чтобы после выполнения операции присваивания на экран выводилось два разных адреса?

    И да - загадка эта не простая: если этот момент на практике не встретить, то угадать зная лишь теорию C++ будет сложно...

    Ну если никто не угадает, то в выходные расскажу...
     
  12. _DEN_

    _DEN_ DEN

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

    В следующий раз, когда захочешь показаться умным, попробуй что-то более оригинальное, чем задачи по информатике для детей начальной школы.

    Код (Text):
    1. #include <iostream>
    2.  
    3. class top
    4. {
    5.     virtual void foo(){}
    6. };
    7.  
    8. class mid1 : public top
    9. {
    10.     virtual void foo(){}
    11. };
    12.  
    13. class mid2
    14. {
    15.     virtual void foo(){}
    16. };
    17.  
    18. class bottom : public mid1, public mid2
    19. {
    20.     virtual void foo(){}
    21. };
    22.  
    23. int main()
    24. {
    25.     bottom nafanya;
    26.  
    27.     mid2* pointer1 = &nafanya;
    28.     bottom* pointer2 = &nafanya;
    29.  
    30.     pointer1 = pointer2;
    31.  
    32.     std::cout << pointer1 << "  " << pointer2 << std::endl;
    33.  
    34.     return 0;
    35. }
     
  13. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    Nafanya
    У Вас должно быть колоссальный опыт разработки на плюсах - выполнение домашних заданий,сдача зачетов...
     
  14. wf_

    wf_ New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2009
    Сообщения:
    40
    васм...
     
  15. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    у меня както прикол был с указателями. какойто умник до меня догадался переопределить оператор '&' ради красоты. он тоже возвращал адреса, но не те. и отнаследовал от него кучу классов. ото были матюки. так тоже можно голову поморочить.
     
  16. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Правильный ответ на вопрос топикстартера, вдруг кому будет интересно:
    http://ejohn.org/apps/learn/#59
     
  17. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    _DEN_
    Решил вопрос - поделись решением. Интересно же, блин.
     
  18. _DEN_

    _DEN_ DEN

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

    Правильный ответ дал scf
     
  19. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
  20. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    scf
    Чё-то там так много написано, и всё так сложно...
    Проблема же в том, что все замыкания ссылаются на одну и ту же переменную. Ну так почему бы не создать на каждую функцию по переменной, если так хочется?
    Код (Text):
    1. for(var n = 0; n < 10; ++n)
    2. {
    3.     var nn = n;
    4.     save_function(function() { alert(nn); });
    5. }
    Хотя обычно это делается чуть иначе:
    Код (Text):
    1. function make_clozure(n) {
    2.     return function () { alert(n); };
    3. }
    4. for(var n = 0; n < 10; ++n)
    5. {
    6.     save_function(make_clozure(n));
    7. }
    Но это уже вопрос стиля.