![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Salatovec |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 213 Регистрация: 9.1.2008 Репутация: нет Всего: -1 |
Всем привет. Такой вопрос - если написать так:
То так
работает, а так
нет. Как быть? Это сообщение отредактировал(а) Salatovec - 5.8.2014, 14:37 |
||||||
|
|||||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
Добавлено через 3 минуты и 16 секунд http://ideone.com/ozFc6x |
|||
|
||||
Salatovec |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 213 Регистрация: 9.1.2008 Репутация: нет Всего: -1 |
baldina, компилятор ругается на "operator CVertex::*(const CVertex &,double)' must be declared with one parameter".
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
и? ни в моем, ни в приведенном вами коде нет CVertex
Добавлено через 29 секунд скорее всего в классе у вас объявление с одним числом параметров, а определение вне класса - сдругим Добавлено через 1 минуту и 16 секунд и еще: я вам привел примеры операторов - свободных функций. не надо их пихать в класс Добавлено через 2 минуты и 32 секунды посмотрите на работающий пример и подумайте. будут вопросы - задавайте. пока не поймете для чего каждая строчка, дальше не двигайтесь |
|||
|
||||
EnergoHokum |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Оператор умножения перегружен для класса MyVector, поэтому вариант, "где работает", можно переписать так:
Разумеется, для системного типа double перегрузки оператора умножения по умолчанию нет, потому конпелятор и возмущается. Выход тут такой: написать свободную (не привязанную к какому либо классу) функцию перегрузки оператора умножения, которая первым параметром принимает double, а вторым -- требуемый класс. Разумеется, должен быть смысл в умножении числа на класс, например, перегрузив оператор умножения для числа и std::string, получим бессмыслицу: абсолютно неясно, что должно быть возвращено. Строка, повторенная несколько раз? А если умножаем не на целое? 3.1415 строки -- это сколько? Но это я уже отвлёкся. В данном случае будет логично вернуть объект класса MyVector, для которого x, y и [bz[/b] будут равны x, y и [bz[/b] второго входного параметра (some_vector), умноженным каждый на первый входной параметр (some_value):
|
||||
|
|||||
Lukkoye |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 23.3.2013 Репутация: 1 Всего: 1 |
http://rextester.com/VMWGW49228
|
|||
|
||||
kLASTER |
|
|||
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 14.9.2011 Репутация: нет Всего: нет |
Текст вырван из книги, но как мне кажется полностью отвечает на вопрос.
Пример: Помните, что левый операнд — это вызывающий объект. То есть А = В * 2.75; транслируется в следующий вызов функции-члена: А = В.operator* (2.75); Но как насчет приведенного ниже оператора? А = 2.75 * В; // не соответствует функции-члену Концептуально 2.75 * В должно быть эквивалентно В * 2 . 7 5, но первое выражение не может соответствовать функции-члену, поскольку 2.75 не является объектом типа Time. Помните, что левый операнд — это вызывающий объект, но 2 . 75 — не объект. Поэтому компилятор не может заменить это выражение вызовом функции-члена. Один из способов обойти эту трудность — сказать всем (и запомнить самому), что допускается только запись в виде В * 2.75, но не 2.75 * В. Это дружественное к серверу решение, возлагающее ответственность на клиента, что не отвечает принципам ООП. Однако существует другая возможность — использовать функцию, не являющуюся членом. (Вспомните, что большинство операций могут быть перегружены с применением как функций-членов, так и просто функций.) Функция, не являющаяся членом, не вызывается через объект. Вместо этого все значения, которые она использует, включая объекты, передаются в виде явных аргументов. Таким образом, компилятор может представить выражение А = 2.75 * В; //не соответствует функции-члену в виде вызова функции, не являющейся членом: А = operator* (2.75, В); Эта функция должна иметь следующий прототип: Time operator* (double m, const Time & t) ; Это сообщение отредактировал(а) kLASTER - 11.8.2014, 06:05 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |