• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы Karas
  • Дата начала
K

Karas

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

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

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

skysun

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

и для CNumber -
CNumber operator+(const CNumber &other) - параметр операции константная ссылка на CNumber, но не int. Слелай например так
CNumber operator+(const int &other)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!