Передача параметра как ссылки в классе
От: izverg США  
Дата: 27.05.03 19:49
Оценка:
/*
Здравствуйте. Я использую компилятор mingw32 (gcc 3.2). Возник вопрос
такого характера, взгляните на ф-цию main(), мне интересно почему
я не могу вызвать метод onChange с созданным на лету экземпляром
класса number ? при компиляции вот такого варианта

child qwe;
qwe.onChange(number(123));

я получаю ошибку компиляции вида
--------
no matching function for call to `child::onChange(number)'
candidates are: virtual void child::onChange(number&)
--------

а если делать так

number temp(234);
child qwe;
qwe.onChange(temp);

то все нормально. Это связанно с тем что "на лету" созданный экземпляр
number может не дожить пока его обработает onChange ? Возможно ли
както добиться первого варианта использования чтобы не плодить temp
объекты ?

Спасибо.

ps. Полный код программы приведен ниже.
pps. Только что компильнул оба варианта на vc++ 7.0 и все работает ((
Может у gcc есть ключи для компиляции чтобы отбиннаться от этой проблемы ?
*/

#include <stdio.h>

class number
{
public:
    int num;
    number(int i) : num(i) {};
    operator int(){ return num; };
};

class base
{
public:
    virtual void onChange(number& e) {};
    virtual void onError(number& e)
    {
     printf("onError: %i\n", (int)e);
    };
};

class child : public base
{
public:
    virtual void onChange(number& e)
    {
     printf("virtual onChange:\n");
     onError(e);
    };
};

int main()
{
 number temp(234);
 child qwe;
// qwe.onChange(number(123));
 qwe.onChange(temp);
 return 0;
}


Исправлена подсветка синтаксиса. -- ПК.
Re: Передача параметра как ссылки в классе
От: WolfHound  
Дата: 27.05.03 20:19
Оценка: +1
Здравствуйте, izverg, Вы писали:

Ты передаешь временный обьект по не константной ссылке, а это запрещено стандартом. VC в данном случае позволяет себе вольности. Так что либо сделай ссылки константными либо плоди temp'ы.
... << RSDN@Home 1.0 beta 6a >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Передача параметра как ссылки в классе
От: Виталий Заболотный  
Дата: 27.05.03 20:25
Оценка:
> то все нормально. Это связанно с тем что "на лету" созданный экземпляр
number может не дожить пока его обработает onChange ? Возможно ли
както добиться первого варианта использования чтобы не плодить temp
объекты ?

Возможно, используя константные ссылки:

#include <stdio.h>

class number
{
public:
  int num;
  
  number(int i) : num(i) {};
  operator int() const { return num; };
};

class base
{
public:
  virtual void onChange(const number& e) {};
  virtual void onError(const number& e)
  {
    printf("onError: %i\n", (int)e);
  };
};

class child : public base
{
public:
  virtual void onChange(const number& e)
  {
    printf("virtual onChange:\n");
    onError(e);
  };
};

int main()
{
  child qwe;
  qwe.onChange(number(123));
  qwe.onChange(123); // и даже так...:)
  return 0;
}
Posted via RSDN NNTP Server 1.5
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.