Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 конструкторы преобразователи и operator +  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
почему не работает PI + i; и i + PI; ???

class Float;
class Integer {
	int i;
public:
	Integer(int is);
	Integer(float is);
	Integer(Float F);
	friend  Float;
	friend const Integer operator+ (const Integer i1, const  Integer i2);

};
class Float {
	float f;
public:
	Float(float fs);
	Float(int fs);
	Float(Integer I);
	friend  Integer;
	friend const Float operator+ (const  Float i1, const   Float i2);

};



const Float operator+ (const Float i1, const  Float i2) {
	return  Float(i1.f + i2.f);
}

Float::Float(float fs):f(fs) {}
Float::Float(int fs) : f(fs) {}
Float::Float(Integer I): f(I.i) {}


Integer::Integer(int is) : i(is) {};
Integer::Integer(float is) : i(is) {};
Integer::Integer(Float F) : i(F.f) {};


const Integer operator+ (const  Integer i1, const  Integer i2) {
	return Integer(i1.i + i2.i);
}


int main() {
	Integer i(555);
	Float PI(3.14f);
	Integer PIInt(3.14f); //работает происходит неявное преобразование 
	Integer PIInt(PI);
	//PI + i;
	i + PI; //не работает. 

}
22 апр 21, 15:40    [22312627]     Ответить | Цитировать Сообщить модератору
 Re: конструкторы преобразователи и operator +  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

andron81
почему не работает PI + i; и i + PI; ???

Вероятно, по причине, написанной в сообщении об ошибке.

Posted via ActualForum NNTP Server 1.5

22 апр 21, 15:51    [22312641]     Ответить | Цитировать Сообщить модератору
 Re: конструкторы преобразователи и operator +  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
Dimitry Sibiryakov,

гениально, да вот она :
operator +: для перегрузок (2) есть подобные преобразования

но как её понять ?
22 апр 21, 15:56    [22312645]     Ответить | Цитировать Сообщить модератору
 Re: конструкторы преобразователи и operator +  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

andron81
но как её понять ?

Прочитать остальные её десять строчек. Компилятор как Буриданов осёл - не может выбрать.

Posted via ActualForum NNTP Server 1.5

22 апр 21, 17:02    [22312701]     Ответить | Цитировать Сообщить модератору
 Re: конструкторы преобразователи и operator +  [new]
AmKad
Member

Откуда:
Сообщений: 5297
andron81,

У тебя оператор перегружен отдельно для пары int-ов, и отдельно для пары float-ов. Когда складываешь int с float, компилятор не знает, какую из перегрузок ему выбрать.
22 апр 21, 17:08    [22312704]     Ответить | Цитировать Сообщить модератору
 Re: конструкторы преобразователи и operator +  [new]
AmKad
Member

Откуда:
Сообщений: 5297
andron81

class Float;
class Integer {
	int i;
public:
	Integer(int is);
	Integer(float is);
	explicit Integer(Float F);
	friend  Float;
	friend const Integer operator+ (const Integer i1, const  Integer i2);

};
Конкретно твой пример можно хакнуть так.
22 апр 21, 17:36    [22312712]     Ответить | Цитировать Сообщить модератору
 Re: конструкторы преобразователи и operator +  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
AmKad, спасибо.
22 апр 21, 19:44    [22312777]     Ответить | Цитировать Сообщить модератору
 Re: конструкторы преобразователи и operator +  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34697
andron81,

const Integer operator+ (const  Integer i1, const  Integer i2)


Лучше переделать так:

Integer operator+ (const  Integer& i1, const  Integer& i2)


Тогда компилятору не надо будет искать способы создания объектов Integer для передачи и будет меньше вариантов при выборе функции,
которую надо вызвать.

Выходное значение НЕ НАДО делать const, потому что это -- временный объект, и без CONST у компилятора будет больше возможностей
для оптимизации (RVO, NRVO, move semantics)

В других случаях, в других функциях, тебе тоже следует рассмотреть замену передачи аргументов по значению
на передачу по константной ссылке.
26 апр 21, 11:37    [22314337]     Ответить | Цитировать Сообщить модератору
 Re: конструкторы преобразователи и operator +  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
MasterZiv,

спасибо. учту
27 апр 21, 15:58    [22315162]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить