Форум программистов, компьютерный форум CyberForum.ru

Блуждание пьяницы и перегрузка операторов - C++

Восстановить пароль Регистрация
 
Yashman
 Аватар для Yashman
1 / 3 / 0
Регистрация: 02.07.2011
Сообщений: 90
19.09.2011, 18:32     Блуждание пьяницы и перегрузка операторов #1
Всем привет! помогите люди добрые решить проблему. В книге по которой я учусь в качестве примера перегрузки операторов дана программа, которая осуществляет такую затею: вводится длина шага и расстояние, на которое нужно отдалиться, а программа, используя случайное число от 0 до 360 выбирает направление человека и передвигает его. Программа завершается когда человек отдаляется на указанное расстояние. Вся проблема в том, что мне не удается скомпилировать указанный код. Вот он:
C++
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
// attach.h
namespace VECTOR
{
    class Vector
    {
    private:
        double x;
        double y;
        double mag;
        double ang;
        char mode;
        void set_mag();
        void set_ang();
        void set_x();
        void set_y();
    public:
        Vector();
        Vector( double n1, double n2, char form = 'r');
        void set( double n1, double n2, char form = 'r');
        ~Vector();
        double xval () const {return x; }
        double yval () const {return y; }
        double magval() const { return mag; }
        double angval() const {return ang; }
        void polar_mode();
        void rect_mode();
 
        Vector operator+ (const Vector &b) const;
        Vector operator-(const Vector & b) const;
        Vector operator-() const;
        Vector operator*(double n) const;
        friend Vector operator*(double n, const Vector & a);
        friend ostream & operator<< (ostream & os, const Vector & v);
    };
}
C++
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// file1.cpp
#include <iostream>
#include "attach.h"
#include <cmath>
using namespace std;
 
namespace VECTOR
{
    const double Rad_to_deg=57.2957795130823;
    void Vector :: set_mag()
    {
        mag = sqrt (x*x + y*y);
    }
    void Vector :: set_ang()
    {
        if ( x == 0.0 && y == 0.00 )
            ang = 0.0;
        else 
            ang = atan2(y,x);
    }
    void Vector :: set_x()
    {
        x = mag*cos(ang);
    }
    void Vector :: set_y()
    {
        y = mag*sin(ang);
    }
    Vector :: Vector()
    {
        x = y = mag = ang = 0.0;
        mode = 'r';
    }
    Vector :: Vector (double n1, double n2, char form)
    {
        mode = form;
        if (form == 'r')
        {
            x = n1;
            y = n2;
            set_mag();
            set_ang();
        }
        else if (form == 'p')
        {
            mag = n1;
            ang = n2 / Rad_to_deg;
            set_x();
            set_y();
        }
        else
        {
            cout << "Incorrect 3rd argument to Vector() ~ - ";
            cout << "vector set to 0\n";
            x = y = mag = ang = 0.0;
        }
    }
    void Vector :: set (double n1, double n2, char form)
    {
        mode = form;
        if (form == 'r')
        {
            x = n1;
            y = n2;
            set_mag();
            set_ang();
        }
        else if (form == 'p')
        {
            mag = n1;
            ang = n2 / Rad_to_deg;
            set_x();
            set_y();
        }
        else
        {
            cout << "Incorrect 3rd argument to Vector() ~ - ";
            cout << "vector set to 0\n";
            x = y = mag = ang = 0.0;
            mode = 'r';
        }
    }
    Vector :: ~Vector()
    {
    }
    void Vector :: polar_mode()
    {
        mode = 'p';
    }
    void Vector :: rect_mode()
    {
        mode = 'r';
    }
    Vector Vector :: operator+ (const Vector & b) const
    {
        return Vector (x + b.x, y + b.x);
    }
    Vector Vector :: operator- (const Vector & b) const
    {
        return Vector (x - b.x, y - b.x);
    }
    Vector Vector :: operator- () const
    {
        return Vector (-x, -y);
    }
    Vector Vector :: operator* (double n) const
    {
        return Vector (n * x, n * y);
    }
    Vector operator* (double n, const Vector & a)
    {
        return a * n;
    }
    ostream & operator << (ostream & os, const Vector & v)
    {
        if (v.mode == 'r')
            os << " (x, y) = (" << v.x << ", " << v.y << ")";
        else if (v.mode == 'p')
        {
            os << " (m, a = (" << v.mag << ". " << v.ang * Rad_to_deg << ") ";
        }
        else
            os << "vector object mode is invalid";
        return os;
    }
}
C++
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
// main.cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "attach.h"
using namespace std;
using namespace VECTOR;
int main()
{
    srand(time(0));
    double direction;
    Vector step;
    Vector result(0.0, 0.0);
    unsigned long steps = 0;
    double target;
    double dstep;
    cout << "Enter target distance (q to quit): ";
    while (cin >> target)
    {
        cout << "Enter step length: ";
        if (!(cin >> dstep))
            break;
        while (result.magval() < target )
        {
            direction = rand() % 360;
            step.set(dstep, direction, 'p');
            result = result + step;
            steps++;
        }
        cout << "After " << steps
            << "steps, the subject "
            "has the following location:\n";
            cout << result << "\n";
        result.polar_mode();
        cout << " or\n" << result << "\n";
        cout <<"Average outward distance per step "
            << result.magval() / steps << "\n";
        steps = 0;
        result.set(0.0, 0.0);
        cout << "Enter target distance (q to quit): ";
    }
    cout << "Bye!\n";
    return 0;
}
Компилятор пишет, что в 117 строке и далее элементы не имеют доступа класса, то есть пишет "член класса Vector v.mode недоступен" и тоже самое про v.x, v.y, v.mag и v.ang. Очень надеюсь на помощь. Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2011, 18:32     Блуждание пьяницы и перегрузка операторов
Посмотрите здесь:

Перегрузка операторов C++
C++ Перегрузка операторов
C++ Перегрузка операторов с++
Перегрузка операторов. C++
C++ Перегрузка операторов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zalogic
 Аватар для zalogic
144 / 140 / 2
Регистрация: 12.12.2010
Сообщений: 253
19.09.2011, 18:57     Блуждание пьяницы и перегрузка операторов #2
а имена фаилов не обзательно должны быть одинаковыми что ли? У тебя хидер с описанием класса с одним именем, а его реализация в фаиле с другим.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.09.2011, 19:38     Блуждание пьяницы и перегрузка операторов #3
zalogic, Это неважно. Странно. Код должен бы быть корректен.
Страж включения бы в хедере не помешал.

Добавлено через 4 минуты
Измени ка файлик заголовочный так...

И не забывай про std::.

C++
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
#include <iosfwd>
 
// attach.h
namespace VECTOR
{
        class Vector
        {
        private:
                double x;
                double y;
                double mag;
                double ang;
                char mode;
                void set_mag();
                void set_ang();
                void set_x();
                void set_y();
        public:
                Vector();
                Vector( double n1, double n2, char form = 'r');
                void set( double n1, double n2, char form = 'r');
                ~Vector();
                double xval () const {return x; }
                double yval () const {return y; }
                double magval() const { return mag; }
                double angval() const {return ang; }
                void polar_mode();
                void rect_mode();
 
                Vector operator+ (const Vector &b) const;
                Vector operator-(const Vector & b) const;
                Vector operator-() const;
                Vector operator*(double n) const;
                friend Vector operator*(double n, const Vector & a);
                friend std::ostream & operator<< (std::ostream & os, const Vector & v);
        };
}
Yashman
 Аватар для Yashman
1 / 3 / 0
Регистрация: 02.07.2011
Сообщений: 90
19.09.2011, 22:09  [ТС]     Блуждание пьяницы и перегрузка операторов #4
ForEveR, спасибо огромное! Почему-то в книге про это ничего не сказано, и там в начале заголовочного файла нет
C++
1
using namespace std;
Yandex
Объявления
19.09.2011, 22:09     Блуждание пьяницы и перегрузка операторов
Ответ Создать тему
Опции темы

Текущее время: 14:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru