Гость
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / конструкторы преобразователи и operator + / 9 сообщений из 9, страница 1 из 1
22.04.2021, 15:40
    #40064783
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конструкторы преобразователи и operator +
почему не работает PI + i; и i + PI; ???

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
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; //не работает. 

}
...
Рейтинг: 0 / 0
22.04.2021, 15:51
    #40064792
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конструкторы преобразователи и operator +
andron81почему не работает PI + i; и i + PI; ???

Вероятно, по причине, написанной в сообщении об ошибке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.04.2021, 15:56
    #40064794
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конструкторы преобразователи и operator +
Dimitry Sibiryakov,

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

но как её понять ?
...
Рейтинг: 0 / 0
22.04.2021, 17:02
    #40064835
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конструкторы преобразователи и operator +
andron81но как её понять ?

Прочитать остальные её десять строчек. Компилятор как Буриданов осёл - не может выбрать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.04.2021, 17:08
    #40064838
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конструкторы преобразователи и operator +
andron81,

У тебя оператор перегружен отдельно для пары int-ов, и отдельно для пары float-ов. Когда складываешь int с float, компилятор не знает, какую из перегрузок ему выбрать.
...
Рейтинг: 0 / 0
22.04.2021, 17:36
    #40064845
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конструкторы преобразователи и operator +
andron81

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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);

};

Конкретно твой пример можно хакнуть так.
...
Рейтинг: 0 / 0
22.04.2021, 19:44
    #40064903
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конструкторы преобразователи и operator +
AmKad, спасибо.
...
Рейтинг: 0 / 0
26.04.2021, 11:37
    #40065874
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конструкторы преобразователи и operator +
andron81,

Код: plaintext
1.
const Integer operator+ (const  Integer i1, const  Integer i2)



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

Код: plaintext
1.
Integer operator+ (const  Integer& i1, const  Integer& i2)



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

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

В других случаях, в других функциях, тебе тоже следует рассмотреть замену передачи аргументов по значению
на передачу по константной ссылке.
...
Рейтинг: 0 / 0
27.04.2021, 15:58
    #40066397
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конструкторы преобразователи и operator +
MasterZiv,

спасибо. учту
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / конструкторы преобразователи и operator + / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]