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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2010, 17:16   #1
ArniLand
Пользователь
 
Регистрация: 27.06.2009
Сообщений: 89
По умолчанию Вычисление угла и радиуса вектора [C++]

В задание нужно подсчитать радиус и угол фи и вывести с помощью метода вывода результаты на экран. Также нужно использовать в программе дружественную функцию.
Вот выкладываю свой код. Пользуюсь компилятором Visual studio professional 2008. В функции double polarRadius() cpp файла компилятор жалуется на то, что эти переменные m_x1, m_x2, m_y1, m_y2 не описанные. Тогда я не совсем понимаю назначение дружественных. Если она имеет права доступа к private переменным, то почему оно выдает ошибки на то что функции подсчета радиуса объявленные закрытыми. Объясните пожалуйста что я не так правильно понял и сделал в программе.
vector.h
Код:
class Vector
{
friend double polarRadius();//здесь объявил дружественную функцию
public:
    Vector( int x1, int x2, int y1, int y2 );
    ~Vector();
    double polarFi();
    void out();
private:
    int m_x1;
    int m_x2;
    int m_y1;
    int m_y2;
};
cpp файл
Код:
#include "stdafx.h"
#include "vector.h"
#include "math.h"
#include "iostream"
Vector::Vector( int x1, int x2, int y1, int y2 )
    : m_x1( x1 ) , m_x2( x2 ) , m_y1( y1 ) , m_y2( y2 )
{
}
Vector::~Vector()
{ 
}
double polarRadius()// функцию которую объявил в классе дружественной
{
    double dx = ( m_x2 - m_x1 );
    double dy = ( m_y2 - m_y1 );
    return sqrt( dx * dx + dy * dy );
}
double Vector::polarFi()
{
    const double EPSILON = 1e-22;
    double dx = ( m_x2 - m_x1 );
    double dy = ( m_y2 - m_y1 );
    if ( dy < EPSILON ) {
        return 90.0;
    }
    return atan( dx / dy ) /  3.1415 * 180.0;
}
void Vector::out()
{
    std::cout << "x1 = " << m_x1 << std::endl;
    std::cout << "x2 = " << m_x2 << std::endl;
    std::cout << "y1 = " << m_y1 << std::endl;
    std::cout << "y2 = " << m_y2 << std::endl;
    std::cout << "dx = " << m_x2 - m_x1 << std::endl;
    std::cout << "dy = " << m_y2 - m_y1 << std::endl;
    std::cout << "radius = " << polarRadius() << std::endl;
    std::cout << "fi = " << polarFi() << " grad" << std::endl;
}
main.cpp
Код:
#include "stdafx.h"
#include "vector.h"
#include "math.h"
#include "iostream"
int main()
{
    Vector v( 1, 3, 4, 5 );
    v.out();
    return 0;
}

Последний раз редактировалось ArniLand; 27.02.2010 в 18:54.
ArniLand вне форума Ответить с цитированием
Старый 27.02.2010, 17:41   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

А ссылку на объект Вы передавать в функцию не пробовали?

Код:
double polarRadius(Vector &v)// функцию которую объявил в классе дружественной
{
    double dx = ( v.m_x2 - v.m_x1 );
    double dy = ( v.m_y2 - v.m_y1 );
    return sqrt( dx * dx + dy * dy );
}

void Vector::out()
{
    std::cout << "x1 = " << m_x1 << std::endl;
    std::cout << "x2 = " << m_x2 << std::endl;
    std::cout << "y1 = " << m_y1 << std::endl;
    std::cout << "y2 = " << m_y2 << std::endl;
    std::cout << "dx = " << m_x2 - m_x1 << std::endl;
    std::cout << "dy = " << m_y2 - m_y1 << std::endl;
    std::cout << "radius = " << polarRadius(this) << std::endl;
    std::cout << "fi = " << polarFi() << " grad" << std::endl;
}
counter вне форума Ответить с цитированием
Старый 27.02.2010, 18:32   #3
ArniLand
Пользователь
 
Регистрация: 27.06.2009
Сообщений: 89
По умолчанию

добавил ссылку на объект как вы показали выше, но всеравно выдает ошибки
Цитата:
1>d:\documents\visual studio 2008\projects\laba5\laba5\laba5.cpp (14) : error C2065: 'm_x2' : undeclared identifier
1>d:\documents\visual studio 2008\projects\laba5\laba5\laba5.cpp (14) : error C2065: 'm_x1' : undeclared identifier
1>d:\documents\visual studio 2008\projects\laba5\laba5\laba5.cpp (15) : error C2065: 'm_y2' : undeclared identifier
1>d:\documents\visual studio 2008\projects\laba5\laba5\laba5.cpp (15) : error C2065: 'm_y1' : undeclared identifier
1>d:\documents\visual studio 2008\projects\laba5\laba5\laba5.cpp (36) : error C2665: 'polarRadius' : none of the 2 overloads could convert all the argument types
1> d:\documents\visual studio 2008\projects\laba5\laba5\laba5.cpp (12): could be 'double polarRadius(Vector &)'
ArniLand вне форума Ответить с цитированием
Старый 27.02.2010, 18:38   #4
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

counter, немного ошиблись
Код:
std::cout << "radius = " << polarRadius(*this) << std::endl;
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 27.02.2010, 18:44   #5
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Greblin, точно! Хотел подправить да не успел.

ArniLand, прототип функции в описании класса не забыли изменить на double polarRadius(Vector &) ?
counter вне форума Ответить с цитированием
Старый 27.02.2010, 18:54   #6
ArniLand
Пользователь
 
Регистрация: 27.06.2009
Сообщений: 89
По умолчанию

изменил все как вы сказали. Уже не сильно понимаю что тогда не так. Вот все компилятор выдает ошибки:
Код:
1>d:\documents\visual studio 2008\projects\laba5\laba5\laba5.cpp(14) : error C2065: 'm_x2' : undeclared identifier
1>d:\documents\visual studio 2008\projects\laba5\laba5\laba5.cpp(14) : error C2065: 'm_x1' : undeclared identifier
1>d:\documents\visual studio 2008\projects\laba5\laba5\laba5.cpp(15) : error C2065: 'm_y2' : undeclared identifier
1>d:\documents\visual studio 2008\projects\laba5\laba5\laba5.cpp(15) : error C2065: 'm_y1' : undeclared identifier
Вот выделил все как я понял что нужно было по исправлять:
vector.h
Код:
class Vector
{
friend double polarRadius(Vector &);//здесь объявил дружественную функцию
public:
    Vector( int x1, int x2, int y1, int y2 );
    ~Vector();
    double polarFi();
    void out();
private:
    int m_x1;
    int m_x2;
    int m_y1;
    int m_y2;
};
cpp файл
Код:
#include "stdafx.h"
#include "vector.h"
#include "math.h"
#include "iostream"
Vector::Vector( int x1, int x2, int y1, int y2 )
    : m_x1( x1 ) , m_x2( x2 ) , m_y1( y1 ) , m_y2( y2 )
{
}
Vector::~Vector()
{ 
}
double polarRadius(Vector &v)// функцию которую объявил в классе дружественной
{
    double dx = ( m_x2 - m_x1 );
    double dy = ( m_y2 - m_y1 );
    return sqrt( dx * dx + dy * dy );
}
double Vector::polarFi()
{
    const double EPSILON = 1e-22;
    double dx = ( m_x2 - m_x1 );
    double dy = ( m_y2 - m_y1 );
    if ( dy < EPSILON ) {
        return 90.0;
    }
    return atan( dx / dy ) /  3.1415 * 180.0;
}
void Vector::out()
{
    std::cout << "x1 = " << m_x1 << std::endl;
    std::cout << "x2 = " << m_x2 << std::endl;
    std::cout << "y1 = " << m_y1 << std::endl;
    std::cout << "y2 = " << m_y2 << std::endl;
    std::cout << "dx = " << m_x2 - m_x1 << std::endl;
    std::cout << "dy = " << m_y2 - m_y1 << std::endl;
    std::cout << "radius = " << polarRadius(*this) << std::endl;
    std::cout << "fi = " << polarFi() << " grad" << std::endl;
}
main.cpp
Код:
#include "stdafx.h"
#include "vector.h"
#include "math.h"
#include "iostream"
int main()
{
    Vector v( 1, 3, 4, 5 );
    v.out();
    return 0;
}

Последний раз редактировалось ArniLand; 27.02.2010 в 18:56.
ArniLand вне форума Ответить с цитированием
Старый 27.02.2010, 19:02   #7
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
изменил все как вы сказали
не все

Код:
double dx = ( v.m_x2 - v.m_x1 );
double dy = ( v.m_y2 - v.m_y1 );
counter вне форума Ответить с цитированием
Старый 27.02.2010, 19:20   #8
ArniLand
Пользователь
 
Регистрация: 27.06.2009
Сообщений: 89
По умолчанию

counter, извините за мою не внимательность. Спасибо за помощь.
Буду нагонять мат часть по ссылкам и указателям, так как позабыл уже про них. Не могли бы вы объяснить пожалуйста, для чего мы передаем в качестве ссылки на объект в функцию и для чего в прототипе функции использовали в качестве параметров Vector и операцию разыменования?
ArniLand вне форума Ответить с цитированием
Старый 27.02.2010, 19:45   #9
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Дружественная функция не является членом класса, следовательно, ей надо передавать объект, с которым имеем дело
Ссылку передаём, чтобы не создавать локальную копию объекта
this - это указатель на объект, а мы хотим передать ссылку на сам объект, поэтому и разыменовываем. Можно было бы передавать сам указатель, но тогда в функции к полям класса надо было бы обращаться через ->
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение тангенса угла наклона (С++) decompressed Помощь студентам 5 31.01.2010 20:06
Поиск высоты и радиуса цилиндрического бака [Delphi] StudeHt Помощь студентам 8 06.01.2010 02:51
паскаль - центр описанной окружност min радиуса Pensioner Помощь студентам 3 19.03.2009 08:51
Опредилите попадает ли точка с координатами(х,у) в круг радиуса R Dog Помощь студентам 2 19.05.2008 19:14