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

Два класса, ошибка из-за приватности полей - C++

Восстановить пароль Регистрация
 
Manco
2 / 2 / 0
Регистрация: 17.09.2012
Сообщений: 34
07.11.2012, 18:01     Два класса, ошибка из-за приватности полей #1
В двух словх...
Первый класс - координата (широта или долгота), второй класс - корабль, у которого есть номер и координаты.
Компилятор указывает на проблемы в строках 57-62 (int ... is private). Почему? Ведь по идее, хоть мы и используем в классе ship класс angle, но обращение к полям angle идёт через объекты класса angle (a1 и a2). Если в классе angle заменить private на public, всё работает.
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
#include <iostream>
using namespace std;
int count=0;
class angle
{
    private:
        int grad;
        float min;
        char dir;
    public:
        angle() {}
        angle(int g,float m,char d): grad(g),min(m),dir(d)
        {
            correct(grad,min,dir);
        }
        void correct(int &grad,float &min, char &dir)
        {
            while(min>=60)
            {
                min-=60;
                grad++;
            }
            if((dir=='W'||dir=='E')&&(grad>=180))
            {
                grad=360-grad;
                if(dir=='W') dir='E';
                else dir='W';
            }
            if((dir=='N'||dir=='S')&&grad<=0)
            {
                grad=grad+90;
                if(dir=='N') dir='S';
                else dir='N';
            }
        }
        void output()
        {
            cout<<grad<<'\xF8'<<min<<"' "<<dir<<endl;
        }
        void enterAng()
        {
            cout<<"Enter grad: ";cin>>grad;
            cout<<"Enter mins: ";cin>>min;
            cout<<"Enter direct: ";cin>>dir;
            correct(grad,min,dir);
        }
};
class ship
{
    private:
        angle a1,a2;
        int number;
    public:
        ship() {number=count++;}
        ship(int g1,float m1, char d1,int g2,float m2, char d2)
        {
            a1.grad=g1;
            a1.min=m1;
            a1.dir=d1;
            a2.grad=g2;
            a2.min=m2;
            a2.dir=d2;
            number=count++;
        }
        void info()
        {
            cout<<"Ship N'"<<number<<"."<<endl;
            cout<<"Koords:"<<endl;
            a1.output();
            cout<<"    ";
            a2.output();
        }
        void set_koord()
        {
            a1.enterAng();
            a2.enterAng();
        }
 
};
int main()
{
    ship s1(134,35.4,'W',21,45.7,'S'),s2;
    s2.set_koord();
    s1.info();
    s2.info();
 
 
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
07.11.2012, 18:08     Два класса, ошибка из-за приватности полей #2
Цитата Сообщение от Manco Посмотреть сообщение
Почему? Ведь по идее, хоть мы и используем в классе ship класс angle, но обращение к полям angle идёт через объекты класса angle (a1 и a2).
А как же еще вы можете обратиться к полям класса без объекта этого класса? (статики не в счет)
Делайте геттеры для этих переменных
Manco
2 / 2 / 0
Регистрация: 17.09.2012
Сообщений: 34
07.11.2012, 18:09  [ТС]     Два класса, ошибка из-за приватности полей #3
Цитата Сообщение от I.M. Посмотреть сообщение
А как же еще вы можете обратиться к полям класса без объекта этого класса? (статики не в счет)
Делайте геттеры для этих переменных
Так ведь объекты класса angle есть - a1 и a2 (это поля класса ship).
mrmaster88
42 / 42 / 3
Регистрация: 13.04.2012
Сообщений: 112
07.11.2012, 18:11     Два класса, ошибка из-за приватности полей #4
попробуйте объявить класс ship как дружественный к angle
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
07.11.2012, 18:14     Два класса, ошибка из-за приватности полей #5
Либо сделай один класс френдом другому, либо пользуйся тобой же написанным конструктором.
Вместо:
C++
1
2
3
4
5
6
a1.grad=g1;
a1.min=m1;
a1.dir=d1;
a2.grad=g2;
a2.min=m2;
a2.dir=d2;
Пиши:
C++
1
2
a1 = angle(g1, m1, d1);
a2 = angle(g2, m2, d2);
Добавлено через 1 минуту
Стоит напомнить, что доступ к приватным членам класса можно получить только изнутри самого класса(из его метода), либо через дружественные объекты. Но никак не напрямую из камчатки...
Manco
2 / 2 / 0
Регистрация: 17.09.2012
Сообщений: 34
07.11.2012, 18:14  [ТС]     Два класса, ошибка из-за приватности полей #6
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Либо сделай один класс френдом другому, либо пользуйся тобой же написанным конструктором.
Вместо:
C++
1
2
3
4
5
6
a1.grad=g1;
a1.min=m1;
a1.dir=d1;
a2.grad=g2;
a2.min=m2;
a2.dir=d2;
Пиши:
C++
1
2
a1 = angle(g1, m1, d1);
a2 = angle(g2, m2, d2);
Добавлено через 1 минуту
Стоит напомнить, что доступ к приватным членам класса можно получить только изнутри самого класса(из его метода), либо через дружественные объекты. Но никак не напрямую из камчатки...
Спасибо.
arzrav
 Аватар для arzrav
71 / 71 / 1
Регистрация: 25.09.2012
Сообщений: 194
07.11.2012, 18:17     Два класса, ошибка из-за приватности полей #7
Всё верно, ведь для того и сделано поле private, чтобы ты не мог нигде, кроме как в самом классе, изменять приватные поля. Если тебе нужно, чтобы кто-то мог установить значение приватных полей из другого места, то напиши в классе angle сеттеры типа:
C++
1
2
3
4
5
6
7
8
9
void SetGrad (int g){
    this.grad=g
}
void SetMin (float m){
    this.min=m
}
void SetDir (char d){
    this.dir=d
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2012, 18:18     Два класса, ошибка из-за приватности полей
Еще ссылки по теме:

C++ Сортировка по одному из полей класса
C++ Доступ к значениям полей класса
Какой способ представления полей класса правильнее? C++

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

Или воспользуйтесь поиском по форуму:
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
07.11.2012, 18:18     Два класса, ошибка из-за приватности полей #8
Цитата Сообщение от Manco Посмотреть сообщение
Ведь по идее, хоть мы и используем в классе ship класс angle, но обращение к полям angle идёт через объекты класса angle (a1 и a2).
Они скрыты и доступны только внутри класса. Добраться к ним можно, например, через конструктор.
Можете в мэйне прописать то же самое, так же выйдет ошибка приватности. Не важно, где объявлен объект, к его приватным переменным доступ может быть только внутри его класса (френды и функции того же класса не в счет).
Yandex
Объявления
07.11.2012, 18:18     Два класса, ошибка из-за приватности полей
Ответ Создать тему
Опции темы

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