powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / конструкторы преобразователи и operator +
9 сообщений из 9, страница 1 из 1
конструкторы преобразователи и operator +
    #40064783
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему не работает 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
конструкторы преобразователи и operator +
    #40064792
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81почему не работает PI + i; и i + PI; ???

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

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

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

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

У тебя оператор перегружен отдельно для пары int-ов, и отдельно для пары float-ов. Когда складываешь int с float, компилятор не знает, какую из перегрузок ему выбрать.
...
Рейтинг: 0 / 0
конструкторы преобразователи и operator +
    #40064845
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
конструкторы преобразователи и operator +
    #40064903
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad, спасибо.
...
Рейтинг: 0 / 0
конструкторы преобразователи и operator +
    #40065874
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
конструкторы преобразователи и operator +
    #40066397
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

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


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