С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214
#1

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

07.06.2014, 20:48. Просмотров 257. Ответов 2
Метки нет (Все метки)

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"
Почему?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2014, 20:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Дружественный оператор не видит закрытые члены класса (C++):

Открытые члены класса переделать в закрытые - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; float sum=0.0; int *s; int *z; string sotr; float...

Функция-друг не видит члены класса private - C++
#include &lt;iostream&gt; using namespace std; class Phone{ friend ostream &amp; operator&lt;&lt;(ostream&amp;,const Phone&amp;); private: int number; ...

класс «Строка» (данные-члены класса – строчка, функции-члены класса – операции) - C++
Помогите пожалйуста с реализацией программы... Реализовать класс «Строка» (данные-члены класса – строчка (указатель на массив, ...

Перегрузка (бинарный, дружественный оператор) - C++
В классе Ellipse перегрузить оператор - (бинарный, дружественный оператор)

дружественный оператор для вектора - C++
всем доброго времени суток хедер friend vector operator + (const vector&amp; v, const vector&amp; w ); friend vector...

Где мы можем использовать, дружественный оператор сложения? - C++
Где мы можем использовать, дружественный оператор сложения,почему нельзя воспользоваться перегрузкой оператора в классе,Зачем усложнять?

2
0x10
2486 / 1661 / 249
Регистрация: 24.11.2012
Сообщений: 4,136
07.06.2014, 20:51 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Сигнатуры разные. В заголовочном файле, в 7 строке Angle передается по ссылке, в реализации (cpp, строка 19) - по значению.
1
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214
07.06.2014, 20:53  [ТС] #3
0x10, спасибо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2014, 20:53
Привет! Вот еще темы с ответами:

Дружественный метод класса и ошибка доступа - C++
class B; class A { public: void f(B&amp; b); }; class B { private:

Закрытые поля класса - C++
Здравствуйте.Помогите разобраться с кодом. Определен следующий класс: struct Cls { Cls(char c, double d, int i); private: ...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * - C++
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Реализовать оператор= для присваивания объекта класса-потомка объекту базового класса - C++
Есть два класса A и B, причем класс B является потомком A. Как реализовать следующее: obj_A = obj_B и obj_B = obj_A? Добавлено через 9...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.