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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2011, 20:09   #1
Eniwent
Новичок
Джуниор
 
Регистрация: 11.11.2011
Сообщений: 4
Сообщение Вопрос по "классам" С++!

[CODE]
Код:
#include <iostream>
#include <cmath>

using namespace std;

// предварительная декларация класса
class Vector;
// предварительное описание функции-друга
double operator/(const Vector &op1, const Vector &op2 );
ostream& operator<<(ostream &os, const Vector &t);

class Vector
{
private: // -------- Закрытые члены данных: реализация
double x, y, z;
public: // --------- Открытый интерфейс
Vector( double ax, double ay, double az ) { x = ax, y = ay, z = az; }// Конструктор
// инициализация членов списком инициализации
Vector() { x = y = z = 0; } // Конструктор по умолчанию
~Vector() {};
void show() { cout << "(" << x << ' ' << y << ' ' << z << ")\n"; } // Дополнительная функция вывода
double len() { return sqrt(x * x + y * y + z * z); } // Длина вектора
bool operator==(Vector op2); // Проверка равенства векторов
void wer(double w); // Умножение вектора на число c помощью функции (2-й вариант)
bool operator/( Vector op2 ); // Проверка колиниарности векторов

// -------- функции-операторы как члены класса
Vector operator*( double w ) const; // Умножение вектора на число используя перегрузку
//Vector operator+( Vector op2 );
Vector & operator+=( const Vector & op2 );
//Vector operator-( Vector op2 );
Vector & operator-=( const Vector & op2 );
Vector operator=( Vector op2 );
Vector operator^( const Vector & op2 ); // Векторное произведение векторов

// -------- функция-оператор как друг
friend double operator*( const Vector & op1, const Vector &op2 ); // Скалярное произведение векторов
friend ostream & operator<<(ostream & os, const Vector & t); // Перегрузка вывода
};

// ---------- Определение функций класса

bool Vector::operator/( Vector op2 ) // Проверка колиниарности векторов
{
if((x / op2.x) == (y / op2.y) == (z / op2.z))
return true;
else
return false;
}

Vector Vector::operator*(double w) const
{
return Vector(w * x, w * y, w * z);
}

ostream& operator<<(ostream &os, const Vector &t) // Перегрузка вывода
{
os << "(" << t.x << ' ' << t.y << ' ' << t.z << ")\n\n";
return os;
}

void Vector::wer(double w) // Умножение вектора на число c помощью функции (2-й вариант)
{
cout << "(" << x * w << ' ' << y * w << ' ' << z * w << ")\n";

return;
}

bool Vector::operator==(Vector op2) // Проверка равенства векторов
{
if((x == op2.x) && (y == op2.y) && (z == op2.z))
return true;
else
return false;
}

Vector Vector::operator^( const Vector &op2 ) // Векторное произведение векторов
{
Vector temp;

temp.x = y * op2.z - op2.y * z;
temp.y = -(x * op2.z - op2.x * z);
temp.z = z * op2.y - op2.y * x;

return temp;
}

/*Vector Vector::operator+( Vector op2 )
{
Vector temp;

temp.x = op2.x + x;
temp.y = op2.y + y;
temp.z = op2.z + z;

return temp;
}
*/
const Vector operator+( const Vector &op1, const Vector &op2)
{
Vector temp( op1 );
temp += op2;
return temp;
}

// эта функция -- не член и не друг (помощник),
// для сложения использует уже определенный +=
Vector& Vector::operator+=( const Vector &op2 )
{
x += op2.x;
y += op2.y;
z += op2.z;

return *this; // Так как результат оператора содержится в левом
} // операнд
ВОПРОС В ЧЕМ!
Почему одни операторы являются членами класса, а остальные как дружественные(то есть за классом)?

Заранее извиняюсь если вопрос не сильно корректный... лабу делала не я ,а на вопрос ответить надо. Заранее благодарен.

Последний раз редактировалось Eniwent; 11.11.2011 в 20:20.
Eniwent вне форума Ответить с цитированием
Старый 11.11.2011, 20:11   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Оформите код тегом #. Потом будем смотреть.
_-Re@l-_ вне форума Ответить с цитированием
Старый 11.11.2011, 20:21   #3
Eniwent
Новичок
Джуниор
 
Регистрация: 11.11.2011
Сообщений: 4
По умолчанию

типо изменил... но если честно не знаю правильно или нет)
Eniwent вне форума Ответить с цитированием
Старый 11.11.2011, 20:27   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Да, так конечно лучше, но всё же форматирование страдает.
Ну да ладно.
Вот например, насколько я вижу, operator<< сделан friend оператором дабы иметь возможность обращаться к закрытым членам x,y,z.
А вот с этим
Код:
friend double operator*( const Vector & op1, const Vector &op2 );
Я вапше не понял. Описание сделали, а реализации нет. Однако, думается, за тем же - дабы иметь возможность обратиться к закрытым x,y,z.
_-Re@l-_ вне форума Ответить с цитированием
Старый 11.11.2011, 20:35   #5
Eniwent
Новичок
Джуниор
 
Регистрация: 11.11.2011
Сообщений: 4
По умолчанию

если бе сам делал смог бе объяснить ,а так я не силён в программировании но сдать надо)... пришёл к преподу, задали вопрос и застопорилось все)... вот решил тут спросить... ну и за это спасибо)... я попробую уточнить ... и корректней написать...
Eniwent вне форума Ответить с цитированием
Старый 11.11.2011, 20:43   #6
Eniwent
Новичок
Джуниор
 
Регистрация: 11.11.2011
Сообщений: 4
По умолчанию

и еще одно, а зачем вообще нужны дружественные операторы класса?
Eniwent вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04