Функции операторов

Тема в разделе "Общие вопросы по С и С++", создана пользователем Karas, 13 июл 2009.

  1. Karas

    Karas Гость

    Доброго времени суток! Меня интересует следующий вопрос.
    В одной книжке написано примерно так:
    Если в классе есть конструктор и функция оператора:
    Код (Text):
    CNumber(int n);
    CNumber operator+(const CNumber &other);
    то становится возможной следующая запись:
    Код (Text):
    CNumber n1 = 1 + n2;
    и написано, что компилятор сначала преобразует число 1 в класс CNumber, а затем вызовет функцию operator+.
    В С++ Builder 6 создаю такой класс:
    Код (Text):
    class CNumber
    {
    int Number;
    public:
    int get_n() const {return Number;}
    CNumber(int n) {Number = n;}
    CNumber operator+(const CNumber &other)
    {CNumber New(Number+other.get_n()); return New;}
    };
    Затем пишу:
    Код (Text):
    CNumber n1(1), n2(2);
    n1 = 3+n2;
    и получаю [C++ Error] Unit1.cpp(29): E2096 Illegal structure operation
    Если компилятор принудительно заставить преобразовать 3 в CNumber:
    Код (Text):
    CNumber n1(1), n2(2);
    n1 = (CNumber)3+n2;
    то все работает. Также помогает создание дружка:
    Код (Text):
    friend CNumber operator+(int n, CNumber &other);
    Но мне все таки хочется узнать насчет первого варианта:
    1. Я что-то непонимаю или где-то ошибаюсь
    2. Автор книги допустил ошибку
    3. Или в разных версиях компилятора данная ситуация обрабатывается по разному.

    PS
    Автор книги использует RHIDE и Visual Studio.
    В моей Visual Studio 2005 похожая ситуация тоже не компиляется.

    Я дико извиняюсь за то что написал тему дважды, у мя оборвалось интернет-соединение во время публикации темы, и я по глупости подумал что тема не появилась на форуме и попытался снова.
     
  2. skysun

    skysun Гость

    Я вижу так- ты к int прибавляешь CNumber - вот компилятор и ругается. Для int нет перегруженой операции "+" с параметром CNumber.

    и для CNumber -
    CNumber operator+(const CNumber &other) - параметр операции константная ссылка на CNumber, но не int. Слелай например так
    CNumber operator+(const int &other)
     
Загрузка...

Поделиться этой страницей