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

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

16.09.2014, 12:32. Показов 2791. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.09.2014, 12:32
Ответы с готовыми решениями:

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

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

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

20
58 / 58 / 13
Регистрация: 12.11.2011
Сообщений: 109
16.09.2014, 12:39
К private членам никак. Если хочешь чтобы члены класса были доступны в классе наследнике, но не были публичными, то правильно помечать их как protected
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
16.09.2014, 12:39  [ТС]
Да я пробовал через 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
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.09.2014, 12:41
Цитата Сообщение от extenup Посмотреть сообщение
К private членам никак.
А как же друзья? В большинстве случаев это конечно говорит о плохом дизайне, но всё же бывают и исключения.

Добавлено через 1 минуту
Цитата Сообщение от extenup Посмотреть сообщение
Если хочешь чтобы члены класса были доступны в классе наследнике, но не были публичными, то правильно помечать их как protected
Только если это методы. Изменяемые данные следует оставлять в секции private.
0
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
16.09.2014, 12:44
делай 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
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
16.09.2014, 12:44  [ТС]
Ну вот допустип обращение через функцию:

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
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.09.2014, 12:49
Цитата Сообщение от NNN7 Посмотреть сообщение
cannot convert 'this' pointer from 'const CPerson' to 'CPerson &'
сделать метод константным:
C++
1
int  CPerson::GetIData() const
2
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
16.09.2014, 12:52  [ТС]
Аа, точно , там же const стоит : CView::CView(const CPerson aPerson)

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


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

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
2393 / 1921 / 763
Регистрация: 27.07.2012
Сообщений: 5,562
16.09.2014, 14:19
C++
1
hh=(*aPerson).iHeight+1;
0
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
16.09.2014, 14:19
Цитата Сообщение от 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
16.09.2014, 14:21
Цитата Сообщение от NNN7 Посмотреть сообщение
Почему не нужно использовать разыменование?
Это и есть разыменование + доступ (operator->). Если хочешь явно, то надо так:
C++
1
2
3
4
void SetDataSource(const CPerson* aPerson)
{
    hh=(*aPerson).iHeight+1;
}
У точки более высокий приоритет, чем у *. Поэтому скобки нужны.
1
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
16.09.2014, 15:13  [ТС]
Всем большое спасибо за объяснения!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.09.2014, 15:13
Помогаю со студенческими работами здесь

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

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

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

Как получить доступ к членам класса из функций
Есть код типа //***************************************************************************** func1() { body; } func2() ...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru