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

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

Войти
Регистрация
Восстановить пароль
 
Manco
2 / 2 / 0
Регистрация: 17.09.2012
Сообщений: 34
#1

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

07.11.2012, 18:01. Просмотров 271. Ответов 7
Метки нет (Все метки)

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

Программа содержит два класса. Оба класса содержат по одному целому полю и по одному указателю на символьный тип. - C++
Помогите решить с объяснениями. Программа содержит два класса. Оба класса содержат по одному целому полю и по одному указателю на...

Доступ к значениям полей класса - C++
вот есть такой класс class book { private: String name; float page; float price; ...

Сортировка по одному из полей класса - C++
Всем привет. Я сделал вот такой список. Вопрос как мне его отсортировать, к примеру, по Id и по Name? #include &lt;iostream&gt; #include...

Начальные значения полей класса - C++
Приветствую всех. Такой вопрос: какие начальные значения принимают поля класса при создании экземпляра этого класса, если не определен...

Получения количества полей класса - C++
Предположим, что я делаю шаблонную функцию для простого сложения. Если мне посылаются int и double, я просто складываю не акцентируя...

В чем разница в задании полей класса? - C++
Доброго времени! Вопрос: В чем состоит разница между описанием полей класса? Как повлияет на создание объекта в памяти? пример 1 ...

7
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
07.11.2012, 18:08 #2
Цитата Сообщение от Manco Посмотреть сообщение
Почему? Ведь по идее, хоть мы и используем в классе ship класс angle, но обращение к полям angle идёт через объекты класса angle (a1 и a2).
А как же еще вы можете обратиться к полям класса без объекта этого класса? (статики не в счет)
Делайте геттеры для этих переменных
0
Manco
2 / 2 / 0
Регистрация: 17.09.2012
Сообщений: 34
07.11.2012, 18:09  [ТС] #3
Цитата Сообщение от I.M. Посмотреть сообщение
А как же еще вы можете обратиться к полям класса без объекта этого класса? (статики не в счет)
Делайте геттеры для этих переменных
Так ведь объекты класса angle есть - a1 и a2 (это поля класса ship).
0
mrmaster88
42 / 42 / 3
Регистрация: 13.04.2012
Сообщений: 112
07.11.2012, 18:11 #4
попробуйте объявить класс ship как дружественный к angle
0
nonedark2008
925 / 664 / 142
Регистрация: 28.07.2012
Сообщений: 1,808
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 минуту
Стоит напомнить, что доступ к приватным членам класса можно получить только изнутри самого класса(из его метода), либо через дружественные объекты. Но никак не напрямую из камчатки...
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 минуту
Стоит напомнить, что доступ к приватным членам класса можно получить только изнутри самого класса(из его метода), либо через дружественные объекты. Но никак не напрямую из камчатки...
Спасибо.
0
arzrav
72 / 73 / 3
Регистрация: 25.09.2012
Сообщений: 212
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
}
0
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
07.11.2012, 18:18 #8
Цитата Сообщение от Manco Посмотреть сообщение
Ведь по идее, хоть мы и используем в классе ship класс angle, но обращение к полям angle идёт через объекты класса angle (a1 и a2).
Они скрыты и доступны только внутри класса. Добраться к ним можно, например, через конструктор.
Можете в мэйне прописать то же самое, так же выйдет ошибка приватности. Не важно, где объявлен объект, к его приватным переменным доступ может быть только внутри его класса (френды и функции того же класса не в счет).
0
07.11.2012, 18:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2012, 18:18
Привет! Вот еще темы с ответами:

Инициализация полей во время объявления класса - C++
Инициализировать поля класса во время его объявления возможно только если в классе отсутствует конструктор? По каким то ещё принципам можно...

Вывод полей класса после сравнения - C++
Проблема: (Нужно отыскать нужный фильм и вывести данные об нем.) Если еще конкретнее, то почему после успешного сравнения некорректно...

Инициализация полей класса при наследовании - C++
Всем добрый вечер. Возникла у меня небольшая задачка, которую никак не могу решить. Имеем базовый класс с константным полем: class A{...

Инициализация полей класса через vector<> - C++
Здравствуйте, можете подсказать как правильно инициализировать поля класса, вот например есть класс MyClass, в нем 2 поля int x int у,...


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

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

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