Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2013, 20:00   #1
Lingri
Новичок
Джуниор
 
Регистрация: 20.09.2013
Сообщений: 3
По умолчанию C++: Классы, перегрузка операторов, дружественные функции.

Здравствуйте. Задание: перегрузить оператор вычитания двух комплексных чисел с использованием классов.

Ход .cpp:

Код:
#include "stdafx.h"
#include "ComplexZ.h"


ComplexZ::ComplexZ (float R1, float I1)
		{
			Re=R1;
			Im=I1;
			
		}

 const pair_t ComplexZ::operator -(const ComplexZ Z1,const ComplexZ Z2)
{
	pair_t A;
	A.first=Z1.Re-Z2.Re;
	A.second=Z2.Im-Z2.Im;
	return A;
}
Код .h:
Код:
#pragma once

#include <utility>

typedef std::pair<float,float> pair_t;

 class ComplexZ
{
public:
	ComplexZ(float,float);
    //ComplexZ(float,float,float,float);
friend	const pair_t operator -(const ComplexZ,const ComplexZ);
	

private: float Re;
private: float Im;
};
При компиляции выходит:
7 IntelliSense: class "ComplexZ" не содержит члена "operator-" h:\ООП\Лаба 2\WindowsFormsApplication1\WindowsF ormsApplication1\ComplexZ.cpp 22
8 IntelliSense: член "ComplexZ::Re" (объявлено в строке 16 из "h:\ооп\лаба 2\windowsformsapplication1\windowsf ormsapplication1\ComplexZ.h") недоступно h:\ООП\Лаба 2\WindowsFormsApplication1\WindowsF ormsApplication1\ComplexZ.cpp 25
9 IntelliSense: член "ComplexZ::Re" (объявлено в строке 16 из "h:\ооп\лаба 2\windowsformsapplication1\windowsf ormsapplication1\ComplexZ.h") недоступно h:\ООП\Лаба 2\WindowsFormsApplication1\WindowsF ormsApplication1\ComplexZ.cpp 25
10 IntelliSense: член "ComplexZ::Im" (объявлено в строке 17 из "h:\ооп\лаба 2\windowsformsapplication1\windowsf ormsapplication1\ComplexZ.h") недоступно h:\ООП\Лаба 2\WindowsFormsApplication1\WindowsF ormsApplication1\ComplexZ.cpp 26
11 IntelliSense: член "ComplexZ::Im" (объявлено в строке 17 из "h:\ооп\лаба 2\windowsformsapplication1\windowsf ormsapplication1\ComplexZ.h") недоступно h:\ООП\Лаба 2\WindowsFormsApplication1\WindowsF ormsApplication1\ComplexZ.cpp 26

Не могу понять, почему компилятор не видит скрытые члены класса, хотя функция объявлена как дружественная...
Объясните, пожалуйста.

Последний раз редактировалось Lingri; 20.09.2013 в 20:28.
Lingri вне форума Ответить с цитированием
Старый 20.09.2013, 20:34   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

А так?
Код:
#include <utility>

typedef std::pair<float,float> pair_t;

class ComplexZ
{
    float Re, Im;
public:
    ComplexZ(float r, float i) : Re(r), Im(i) {};
    friend const pair_t operator-(const ComplexZ &, const ComplexZ &);
};

const pair_t operator-(const ComplexZ &Z1, const ComplexZ &Z2)
{
    pair_t A;
    A.first = Z1.Re - Z2.Re;
    A.second = Z1.Im - Z2.Im;
    return A;
}

int
main() {
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 20.09.2013 в 20:36.
BDA на форуме Ответить с цитированием
Старый 20.09.2013, 20:43   #3
Lingri
Новичок
Джуниор
 
Регистрация: 20.09.2013
Сообщений: 3
По умолчанию

О, сработало.
Можете объяснить, почему используем адреса и не пишем ComplexZ :: operator... ?
Lingri вне форума Ответить с цитированием
Старый 20.09.2013, 20:45   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

если оператор дружественный - то он не метод класса:
Код:
ComplexZ::operator
если он метод класса - то он не может принимать 2 аргумента )

"Адреса используем" чтобы не копировать объект лишний раз.

Я бы еще эту часть выпилил:

Код:
typedef std::pair<float,float> pair_t;
по вашему я могу написать a-b, но написать a-b-c - уже не могу )
rrrFer вне форума Ответить с цитированием
Старый 20.09.2013, 20:48   #5
Lingri
Новичок
Джуниор
 
Регистрация: 20.09.2013
Сообщений: 3
По умолчанию

Секунду, как метод не может принимать 2 аргумента?

И почему используются адреса передаваемых аргументов?
Lingri вне форума Ответить с цитированием
Старый 20.09.2013, 20:50   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

К прочтению - http://habrahabr.ru/post/132014/.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 20.09.2013, 21:22   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Lingri
нада ты пишешь
a - b
то выполняется оператор - объекта "a". Объект "b" будет аргументом (это бинарный оператор).
может быть унарный оператор
-a (тут выполняется оператор объекта "a" без параметров).

Т.е. оператор - может принимать 0 или 1 аргумент. Все остальное трудно представить для бинарного/унарного оператора, по определению).

С другой стороны плюсы позволяют тебе объявить дружественную функцию (не метод), не принадлежащую ни одному объекту, которая будет принимать 2 аргумента

назовешь ты ее
T& minus(T&, T&)
или
T& operator-(T&, T&)
разницы особой нет (ну в первом случае использовать менее удобно, МБ).

В этом случае в выражении a-b может использоваться такая функция, а "а" и "б" будут ее аргументами.

По ссылкам я уже написал. Но ты можешь открыть первые страницы любого учебника по С++(или даже Си). Всякие классы и операторы тут не причем. При передаче объекта по значению создается копия.
Можешь поэкспериментировать. Допиши конструктор копирования и заставь его выводить что-нибудь в консоль при выполнении.
Запусти программу со ссылками и без, и посмотри сколько раз выполнится твой конструктор в каждом из случаев. Но и в книжку заглянуть не поленись.

Последний раз редактировалось rrrFer; 20.09.2013 в 21:27.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы, перегрузка операторов. Dimasanius Общие вопросы C/C++ 5 08.05.2014 02:13
Дружественные функции и классы Opiym Помощь студентам 1 05.04.2010 21:51
Классы ны С++, перегрузка функций,операторов Shturmovik Помощь студентам 1 04.06.2009 22:58
Задача на классы, перегрузка операторов [C++] Roomper Помощь студентам 13 30.05.2009 08:36
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15