Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
8 / 8 / 10
Регистрация: 05.09.2013
Сообщений: 502
1

Доступ к членам класса

16.09.2014, 12:32. Просмотров 1869. Ответов 20
Метки нет (Все метки)

Есть два класса:

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
#include "stdafx.h"
#include <iostream>
using namespace std;
class CPerson
{
    /*закрытые члены*/
private:
    int iData; 
    
/*открытые члены*/
public:
    int iHeight;
    int iWeight;
 
 
    CPerson::CPerson()
{
    iHeight=iWeight=iData=0;
         
}
    /*функция для установки значений*/
     void CPerson::Set(int aH,int aW,int aD)
      {
          iHeight=aH;
          iWeight=aW;
          iData=aD;
      }
 
 
};
 
class CView:public CPerson{
 
 
    public:
    int hh,ww,dd;
 
    //передаём объект CPerson
     CView::CView(const CPerson aPerson)
    {
    
        hh=aPerson.iHeight;
        ww=aPerson.iWeight;
        dd=aPerson.iData;
    
    }
 
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    CPerson p1;
    p1.Set(1,2,3);
 
    return 0;
}
Как получить доступ к члену private int iData в классе CView ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2014, 12:32
Ответы с готовыми решениями:

Доступ к членам класса
Объект класса не может получить доступ к своим переменным?

Доступ к private членам класса
Почему при таком объявлении не работает оператор вывода, по идее он же объявлен как друг класса и...

Доступ к защищенным членам класса
Срочно!! помогите пожалуйста Что не правильно : class my { int i; public: ………....

Доступ к закрытым членам базового класса
помогите понять что я не так сделал ? #include &lt;iostream&gt; using namespace std; class A { ...

20
56 / 56 / 13
Регистрация: 12.11.2011
Сообщений: 109
16.09.2014, 12:39 2
К private членам никак. Если хочешь чтобы члены класса были доступны в классе наследнике, но не были публичными, то правильно помечать их как protected
0
8 / 8 / 10
Регистрация: 05.09.2013
Сообщений: 502
16.09.2014, 12:39  [ТС] 3
Да я пробовал через protected , тоже не получается:

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
class CPerson
{
    /*закрытые члены*/
protected:
    int iData; 
    
/*открытые члены*/
public:
    int iHeight;
    int iWeight;
 
 
    CPerson::CPerson()
{
    iHeight=iWeight=iData=0;
         
}
    /*функция для установки значений*/
     void CPerson::Set(int aH,int aW,int aD)
      {
          iHeight=aH;
          iWeight=aW;
          iData=aD;
      }
 
 
};
 
class CView:public CPerson{
 
 
    public:
    int hh,ww,dd;
 
    //передаём объект CPerson
     CView::CView(const CPerson aPerson)
    {
    
        hh=aPerson.iHeight;
        ww=aPerson.iWeight;
        dd=aPerson.iData;
    
    }
 
};
Пишит , что 'CPerson::iData' : cannot access protected member declared in class 'CPerson'
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.09.2014, 12:41 4
Цитата Сообщение от extenup Посмотреть сообщение
К private членам никак.
А как же друзья? В большинстве случаев это конечно говорит о плохом дизайне, но всё же бывают и исключения.

Добавлено через 1 минуту
Цитата Сообщение от extenup Посмотреть сообщение
Если хочешь чтобы члены класса были доступны в классе наследнике, но не были публичными, то правильно помечать их как protected
Только если это методы. Изменяемые данные следует оставлять в секции private.
0
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
16.09.2014, 12:44 5
делай iData protected, тогда доступ из производного класса должен быть.

либо
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CPerson
{
    /*закрытые члены*/
private:
    int iData; 
    
/*открытые члены*/
public:
    int iHeight;
    int iWeight;
    int     getiData(void)
    {
        return  iData;
    }
    void    setiData(const int iiData)
    {
        iData = iiData;
    }
и вперед.
0
8 / 8 / 10
Регистрация: 05.09.2013
Сообщений: 502
16.09.2014, 12:44  [ТС] 6
Ну вот допустип обращение через функцию:

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
class CPerson
{
    /*закрытые члены*/
private:
    int iData; 
    
/*открытые члены*/
public:
    int iHeight;
    int iWeight;
 
 
    CPerson::CPerson()
{
    iHeight=iWeight=iData=0;
         
}
    /*функция для установки значений*/
     void CPerson::Set(int aH,int aW,int aD)
      {
          iHeight=aH;
          iWeight=aW;
          iData=aD;
      }
 
     //функция возвращает iData*/
    int  CPerson::GetIData()
     {
        return iData;
     }
 
 
 
 
};
 
class CView:public CPerson{
 
 
 
 
    public:
    int hh,ww,dd;
 
    //передаём объект CPerson
     CView::CView(const CPerson aPerson)
    {
    
        hh=aPerson.iHeight;
        ww=aPerson.iWeight;
        dd=aPerson.GetIData();
    
    }
 
};
Как тогда здесь правильно передать значение?
C++
1
dd=aPerson.GetIData();
- выдаёт ошибку 'CPerson::GetIData' : cannot convert 'this' pointer from 'const CPerson' to 'CPerson &'
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.09.2014, 12:49 7
Цитата Сообщение от NNN7 Посмотреть сообщение
cannot convert 'this' pointer from 'const CPerson' to 'CPerson &'
сделать метод константным:
C++
1
int  CPerson::GetIData() const
2
8 / 8 / 10
Регистрация: 05.09.2013
Сообщений: 502
16.09.2014, 12:52  [ТС] 8
Аа, точно , там же const стоит : CView::CView(const CPerson aPerson)

получается , что с константными объектами могут работать только константные методы?
0
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
16.09.2014, 12:53 9
только смысл какой в dd, если это iData, к которому из CView можно получить доступ в любой момент.


Цитата Сообщение от NNN7 Посмотреть сообщение
получается , что с константными объектами могут работать только константные методы?
да, для const объекта надо вызывать const методы. так компилятор заботится о неизменности полей константного объекта.
0
56 / 56 / 13
Регистрация: 12.11.2011
Сообщений: 109
16.09.2014, 12:54 10
Цитата Сообщение от Tulosba Посмотреть сообщение
А как же друзья? В большинстве случаев это конечно говорит о плохом дизайне, но всё же бывают и исключения.
Это да. В C++ много как можно получить private данные. Можно через файл/базу, расшаренную память. Но лучше делать как правильно, а не как можно.
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.09.2014, 12:56 11
Цитата Сообщение от extenup Посмотреть сообщение
Можно через файл/базу, расшаренную память.
Поподробнее расскажите?
Цитата Сообщение от extenup Посмотреть сообщение
Но лучше делать как правильно, а не как можно.
friend правильно, но в определенных случаях.
0
56 / 56 / 13
Регистрация: 12.11.2011
Сообщений: 109
16.09.2014, 13:06 12
Цитата Сообщение от Tulosba Посмотреть сообщение
Поподробнее расскажите?
А что тут рассказывать? Данные можно хранить не только в поле класса, но и вне класса, вплоть до удалённого какого-нибудь сервера, а из другого класса эти данные брать и изменять. Возможности безграничны, вопрос только в правильной архитектуре. А фишка с friend мне кажется какой-то костыльной и не правильной. Если создатель класса сделал член private значит к нему не надо обращаться, а если он хочет чтобы к нему обращались из классов наследников то он член пометит как protected.
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.09.2014, 13:20 13
Цитата Сообщение от extenup Посмотреть сообщение
, вплоть до удалённого какого-нибудь сервера,
Это уже никоим образом к языку не относится.
Цитата Сообщение от extenup Посмотреть сообщение
А фишка с friend мне кажется какой-то костыльной и не правильной.
Посмотрите хотя бы стандартную библиотеку. Там тоже используется friend в некоторых местах.
Цитата Сообщение от extenup Посмотреть сообщение
а если он хочет чтобы к нему обращались из классов наследников то он член пометит как protected.
Повторюсь ещё раз:
Цитата Сообщение от Tulosba Посмотреть сообщение
Только если это методы. Изменяемые данные следует оставлять в секции private.
1
8 / 8 / 10
Регистрация: 05.09.2013
Сообщений: 502
16.09.2014, 13:57  [ТС] 14
А можно ещё маленький вопрос :
если в функцию передаётся параметр через указатель :
/*для изменения данных*/
C++
1
2
3
4
5
6
    void SetDataSource(const CPerson *aPerson)
    {
        *aPerson.iHeight=*aPerson.iHeight+1;
        
    
    }
Как правильно обратится к полю ?
0
13468 / 7131 / 1712
Регистрация: 30.01.2014
Сообщений: 11,906
16.09.2014, 14:04 15
NNN7,
C++
1
2
3
4
    void SetDataSource(CPerson *aPerson)
    {
        aPerson->iHeight += 1;
    }
0
8 / 8 / 10
Регистрация: 05.09.2013
Сообщений: 502
16.09.2014, 14:11  [ТС] 16
Не получается никак обратится:

C++
1
2
3
4
5
6
7
8
9
10
11
12
void SetDataSource(const CPerson* aPerson)
    {
        
        hh=*aPerson.iHeight+1;
    
    }
//с обычной функцией всё нормально
    void f(const int* a)
    {
      hh=*a+1;
    
    }
И выдаёт ошибку .iHeight' must have class/struct/union

Добавлено через 2 минуты
Можете , пожалуйста , объяснить , как это работает ?

Почему не нужно использовать разыменование?
0
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
16.09.2014, 14:19 17
C++
1
hh=(*aPerson).iHeight+1;
0
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
16.09.2014, 14:19 18
Цитата Сообщение от NNN7 Посмотреть сообщение
void SetDataSource(const CPerson* aPerson) { hh=*aPerson.iHeight+1; }
вот два варианта:
C++
1
2
        hh=(*aPerson).iHeight + 1;
        hh=aPerson->iHeight + 1;
Точку используешь, если работаешь с копией объекта или с ссылкой, -> если обращаешься к полю через указатель на объект.
а твой пример со звездочкой не работает, так как по правилам приоритета звездочка относится к aPerson.iHeight, а не к aPerson. Поэтому происходит попытка получить значение, лежащее по адресу aPerson.iHeight, что само по себе неправильно. Если бы aPerson не был указателем, а iHeight - был, то это бы заработало)
1
13468 / 7131 / 1712
Регистрация: 30.01.2014
Сообщений: 11,906
16.09.2014, 14:21 19
Цитата Сообщение от NNN7 Посмотреть сообщение
Почему не нужно использовать разыменование?
Это и есть разыменование + доступ (operator->). Если хочешь явно, то надо так:
C++
1
2
3
4
void SetDataSource(const CPerson* aPerson)
{
    hh=(*aPerson).iHeight+1;
}
У точки более высокий приоритет, чем у *. Поэтому скобки нужны.
1
8 / 8 / 10
Регистрация: 05.09.2013
Сообщений: 502
16.09.2014, 15:13  [ТС] 20
Всем большое спасибо за объяснения!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2014, 15:13

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Доступ к членам одного класса с другого
Есть три файла: A.cpp: #include &quot;B.cpp&quot; class AA { int A; public: AA(int a) { A = a;

Доступ к закрытым членам класса(шаблона)
Вопрос почему компилятор выдает ошибку в функции main? Ситуация следующая имеется шаблон (класс)...

Как получить доступ к членам класса из функций
Есть код типа //*****************************************************************************...

Доступ к членам класса класса
Всем привет. Вобщем есть базовый класс, и два производных. Пользователь вводит координаты нужно...


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

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

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