with ()
От: Yurets Земля  
Дата: 28.08.02 22:24
Оценка:
Привет ! :)

В javascript есть такой оператор — with ( )
очень удобен когда нужно много обращаться к методам|переменным/членам одного и того же
класса.

Например: (всё схематично, не пугайтесь :~)


class A
{
  int a;
  int b;
  int cdfdsf(bool);
  int ddsfd();
// и т.п.
}

A abc;

with (abc)
{
  .a = 1;
  .b = 2;
  .cdfdsf(true) ;
  .ddsfd();
}



Ну и тому подобное. :-) Как это в С реализовать ?

зы: Надеюсь подробно объяснил ... :`))))

---
я это задавал в фидо, конкретного ответа не нашёл :(
Были предложения сделать так:
//допустим
class A {
public:

A& f1();
A& f2();
A& f3();

};

//Затем вызываем где - нибудь:

A inst1;

inst1
   .f1()
   .f2()
   .f3();


Но это подходит только для методов. Мне же нужно и для переменных. :~)

Мож макрос какой-нють написать ? :)
Re: with ()
От: IT Россия linq2db.com
Дата: 28.08.02 23:20
Оценка:
Здравствуйте Yurets, Вы писали:

Y>В javascript есть такой оператор — with ( )


Я бы тоже хотел иметь такую штуку в C++, но нету её и никак более менее путно сэмулировать её не получится
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: with ()
От: Кодт Россия  
Дата: 29.08.02 07:58
Оценка:
Здравствуйте IT, Вы писали:

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


Y>>В javascript есть такой оператор — with ( )


IT>Я бы тоже хотел иметь такую штуку в C++, но нету её и никак более менее путно сэмулировать её не получится


В Паскале есть, в Васике есть, вот даже в Жабаскрипе есть, а в Сях — ыыы
Перекуём баги на фичи!
Re[2]: Winsock vs Wininet
От: BlackBox Россия ---
Дата: 30.08.02 04:34
Оценка:
Здравствуйте IT, Вы писали:

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


Y>>В javascript есть такой оператор — with ( )


IT>Я бы тоже хотел иметь такую штуку в C++, но нету её и никак более менее путно сэмулировать её не получится



У Страуструпа в специальном издании есть пример (точно не помню, а книги под рукой нет):

void f(Date &d)
{
  d.add_day(1).add_month(1).add_year(1);
}


в какой главе точно не помню, может более знающие меня поправят...
Re[3]: Winsock vs Wininet
От: Bai  
Дата: 30.08.02 05:29
Оценка:
Здравствуйте BlackBox, Вы писали:

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


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


Y>>>В javascript есть такой оператор — with ( )


IT>>Я бы тоже хотел иметь такую штуку в C++, но нету её и никак более менее путно сэмулировать её не получится



BB>У Страуструпа в специальном издании есть пример (точно не помню, а книги под рукой нет):


BB>
BB>void f(Date &d)
BB>{
BB>  d.add_day(1).add_month(1).add_year(1);
BB>}
BB>


BB>в какой главе точно не помню, может более знающие меня поправят...

Да там действительно есть такой пример
но по моему он не совсем сюда
для того что бы сделать такую цепочку надо просто
возвращать ссылку т.е.

Date& Date::add_day(int n)
{
/* код*/
return *this;

}
и дял других методов
это для такой цепочки
Re[2]: with ()
От: Alexander Shargin Россия RSDN.ru
Дата: 30.08.02 13:37
Оценка: 24 (2)
Здравствуйте IT, Вы писали:

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


Y>>В javascript есть такой оператор — with ( )


IT>Я бы тоже хотел иметь такую штуку в C++, но нету её и никак более менее путно сэмулировать её не получится


Не знаю на счёт путно, но попробовать можно, например:

#define WITH(cls, obj)                                 {                                                      struct ___WithHelperClass : public cls              {                                                      void do_with()                                      {                                    

#define END_WITH(obj)                                        }                                                };                                                                                                      ((___WithHelperClass&)obj).do_with();            }


Использлвание:

   struct SS
   {
      int a;
      double b;
      char c;

      void f() {}
      void p(int i)
      {
         printf("printing... i=%d, a=%d, b=%lf, c=%c", i, a, b, c);
      }
   };

   SS ss;

   WITH(SS, ss)
      a = 1;
      b = 2;
      c = 3;
      f();
      p(1);
   END_WITH(ss)


Причём VC это дело оптимизирует в zero overhead. Со стандартом тут, я думаю, не всё гладко, но это уже не ко мне. Я идеи генерирую.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[3]: with ()
От: Alexander Shargin Россия RSDN.ru
Дата: 30.08.02 13:40
Оценка: 14 (1)
Здравствуйте Alexander Shargin, Вы писали:

AS>Не знаю на счёт путно, но попробовать можно, например:


Мда. Нету в мире совершенства...

#define WITH(cls, obj)
   {
      struct ___WithHelperClass : public cls
      {
         void do_with()
         {

#define END_WITH(obj)
         }
      };

      ((___WithHelperClass&)obj).do_with();
   }
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[3]: with ()
От: IT Россия linq2db.com
Дата: 30.08.02 17:36
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

AS>Не знаю на счёт путно, но попробовать можно, например:


[skip]

Саня, затолкай это в Исходники (со времени твоего последнего появления тут появился такой форум ) и посмотрим как много народу возмёт это на вооружение.
Если нам не помогут, то мы тоже никого не пощадим.
Re: with ()
От: misha  
Дата: 02.09.02 06:39
Оценка:
Здравствуйте Yurets, Вы писали:

Y>Привет !


Y>В javascript есть такой оператор — with ( )

Y>очень удобен когда нужно много обращаться к методам|переменным/членам одного и того же
Y>класса.

Сколько ледёв, столько мнениев.
Недавно пришлось мне срочно (автор был в отпуске) править бооольшую проограмму на ВБ. Конечно может и удобно пользовать with, когда ваяеш что то новое, замечательное, никем ранше не деланное, но когда эти распроклятые операторы растыканы на каждом шагу, ты тупо смотришь на строчку и не можеш понять, а какого же обьекта метод сейчас вызывается, все кажется не таким класным и веселым. Приходится постоянно лазить по коду и держать в голове какой же обьект текущий. А чуть двинулся по коду (обычно при отладку весь код подряд не просматриваешь) и, блин, снова старая песня — а чего это мы тут вызываем? Плюс сроки, плюс обрадованный заказчик, которому это все нужно было позавчера... Сильные ощущения.......
Это реальная жисть господа...
Re[2]: with ()
От: misha  
Дата: 02.09.02 07:52
Оценка:
Здравствуйте misha, Вы писали:

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


Y>>Привет !


Y>>В javascript есть такой оператор — with ( )

Y>>очень удобен когда нужно много обращаться к методам|переменным/членам одного и того же
Y>>класса.

M>Сколько ледёв, столько мнениев.

M>Недавно пришлось мне срочно (автор был в отпуске) править бооольшую проограмму на ВБ. Конечно может и удобно пользовать with, когда ваяеш что то новое, замечательное, никем ранше не деланное, но когда эти распроклятые операторы растыканы на каждом шагу, ты тупо смотришь на строчку и не можеш понять, а какого же обьекта метод сейчас вызывается, все кажется не таким класным и веселым. Приходится постоянно лазить по коду и держать в голове какой же обьект текущий. А чуть двинулся по коду (обычно при отладку весь код подряд не просматриваешь) и, блин, снова старая песня — а чего это мы тут вызываем? Плюс сроки, плюс обрадованный заказчик, которому это все нужно было позавчера... Сильные ощущения.......
M>Это реальная жисть господа...


Sorry, людей конечно , не подумайте чего...
Re[4]: with ()
От: Кодт Россия  
Дата: 02.09.02 08:46
Оценка:
Здравствуйте Alexander Shargin, Вы писали:

AS>Здравствуйте Alexander Shargin, Вы писали:


AS>>Не знаю на счёт путно, но попробовать можно, например:


AS>Мда. Нету в мире совершенства...


AS>
AS>#define WITH(cls, obj)
AS>   {
AS>      struct ___WithHelperClass : public cls
AS>      {
AS>         void do_with()
AS>         {

AS>#define END_WITH(obj)
AS>         }
AS>      };

AS>      ((___WithHelperClass&)obj).do_with();
AS>   }
AS>


А не обломится?
Ты же в результате изолируешься от всех локальных переменных контекста.
Весь кайф-то with состоит в том, чтобы к членам объекта доступаться наравне с локальными:
sub demo(obj as SomeObject)
  dim i as integer
  for i = 1 to 100
    with obj
      .item1 = i
      .item2 = i*i
      debug.print "obj #"; i; " is "; .item3
    end with
  next i
end sub
Перекуём баги на фичи!
Re: with ()
От: comer США http://getboost.codeplex.com/
Дата: 03.09.02 12:56
Оценка: 11 (1)
Здравствуйте Yurets, Вы писали:

Y>В javascript есть такой оператор — with ( )

Y>очень удобен когда нужно много обращаться к методам|переменным/членам одного и того же
Y>класса.
>Как это в С реализовать ?

Ну разве что так:

A abc;

// with(abc) {
  A& a = abc;

  a.a = 1;
  a.b = 2;
  a.cdfdsf(true) ;
  a.ddsfd();
// }

Что бы людей особенно страшными дефайнами не пугать и разными лишними классами.

А если без шуток, то такая конструкция хороша если к abc не очень удобный доступ, что либо вроде: tmp[i+GetValueX()].GetABC(r.Next()) и т.п.
getboost.codeplex.com
citylizard.codeplex.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.