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

Дружественный оператор не видит закрытые члены класса - C++

Восстановить пароль Регистрация
 
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
07.06.2014, 20:48     Дружественный оператор не видит закрытые члены класса #1
angle.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#pragma once
#include <iostream>
using std::ostream;
 
class Angle
{
    friend ostream& operator<<(ostream& out, Angle &arg);
public:
    Angle(int g = 0, int m = 0);
    ~Angle();
    float Radians();
    void To360();
    void Inc(int g, int m);
    void Dec(int g, int m);
    float Sin();
    bool operator>(Angle r);
    bool operator<(Angle r);
    bool operator==(Angle r);
private:
    int gr, min;
    float Radians(float alpha);
};
angle.cpp:
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
#define _USE_MATH_DEFINES
#include <math.h>
#include "angle.h"
using std::cout;
using std::ostream;
 
Angle::Angle(int g, int m)
{
    if (m > 60)
        cout << "Минут больше 60, они будут переведены в градусы\n";
    gr = g + m/60;
    min = m%60;
}
 
Angle::~Angle()
{
}
 
ostream& operator<<(ostream& out, Angle A)
{
    out << A.gr << " градусов " << A.min << " минут\n";
    return out;
}
 
float Angle::Radians()
{
    return gr*M_PI/180;
}
 
void Angle::To360()
{
    if (abs(gr) > 360)
        gr %= 360;
    if (gr < 0)
        gr += 360;
}
 
void Angle::Inc(int g, int m)
{
    gr += g + m/60;
    min += m%60;
}
 
void Angle::Dec(int g, int m)
{
    gr -= g + m/60;
    min -= m%60;
}
 
float Angle::Sin()
{
    return sin(Radians(gr + min/60.));
}
 
bool Angle::operator<(Angle r)
{
    if (gr%360 < r.gr%360)
        return true;
    else if (gr%360 > r.gr%360)
        return false;
    else
        return min < r.min;
}
 
bool Angle::operator==(Angle r)
{
    return gr%360 == r.gr%360 && min == r.min;
}
 
bool Angle::operator>(Angle r)
{
    if (gr%360 > r.gr%360)
        return true;
    else if (gr%360 < r.gr%360)
        return false;
    else
        return min > r.min;
}
 
float Radians(float alpha)
{
    return alpha*M_PI/180;
}
Ругается:
Код
1>d:\с++\test\test\angle.cpp(21): error C2248: Angle::gr: невозможно обратиться к private член, объявленному в классе "Angle"
1>          d:\с++\test\test\angle.h(20): см. объявление "Angle::gr"
1>          d:\с++\test\test\angle.h(6): см. объявление "Angle"
1>d:\с++\test\test\angle.cpp(21): error C2248: Angle::min: невозможно обратиться к private член, объявленному в классе "Angle"
1>          d:\с++\test\test\angle.h(20): см. объявление "Angle::min"
1>          d:\с++\test\test\angle.h(6): см. объявление "Angle"
Почему?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2014, 20:48     Дружественный оператор не видит закрытые члены класса
Посмотрите здесь:

класс «Строка» (данные-члены класса – строчка, функции-члены класса – операции) C++
дружественный оператор для вектора C++
C++ Статические члены класса
Где мы можем использовать, дружественный оператор сложения? C++
C++ открытые члены класса переделать в закрытые
C++ Перегрузка (бинарный, дружественный оператор)
Дружественный метод класса и ошибка доступа C++
Указатели на члены класса C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
07.06.2014, 20:51     Дружественный оператор не видит закрытые члены класса #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Сигнатуры разные. В заголовочном файле, в 7 строке Angle передается по ссылке, в реализации (cpp, строка 19) - по значению.
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
07.06.2014, 20:53  [ТС]     Дружественный оператор не видит закрытые члены класса #3
0x10, спасибо
Yandex
Объявления
07.06.2014, 20:53     Дружественный оператор не видит закрытые члены класса
Ответ Создать тему
Опции темы

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