Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
1

Доступ к закрытым членам класса(шаблона)

11.11.2016, 19:04. Показов 1304. Ответов 4
Метки нет (Все метки)

Вопрос почему компилятор выдает ошибку в функции main? Ситуация следующая имеется шаблон (класс) элемента списка, реализован шаблон (класс) самого связного списка, в функции main создан список заполнен элементами, но при попытке к обращения к указателю на первый элемент и вызова с помощью его данных, хранящихся в первом элементе, компилятор выдает ошибку.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
узел списка
 
#ifndef LISTNODE_H_
#define LISTNODE_H_
template <class NODETYPE> class List;
 
template <class NODETYPE>
class ListNode{
    friend class List<NODETYPE>;
public:
    ListNode(const NODETYPE &);
    NODETYPE getData()const;
private:
    NODETYPE data;
    ListNode <NODETYPE> *nextPtr;
};
 
template<class NODETYPE>
ListNode <NODETYPE>::ListNode(const NODETYPE & info): data(info), nextPtr(0){}
 
template <class NODETYPE>
NODETYPE ListNode <NODETYPE>::getData()const{return data;}
#endif /* LISTNODE_H_ */
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
класс листа
 
#include <cassert>
#include "ListNode.h"
 
using std::cout;
 
template<class NODETYPE>
 
class List{
 
public:
    List();
    ~List();
    void insertAtFront(const NODETYPE &);
    void insertAtBack(const NODETYPE &);
    bool removeFromFront(NODETYPE &);
    bool removeFromBack(NODETYPE &);
    void contenace(List<NODETYPE>&, List<NODETYPE>&);
    bool isEmpty()const;
    void print()const;
    void clearList();
private:
    ListNode <NODETYPE>* firstPtr;
    ListNode <NODETYPE>* lastPtr;
    ListNode <NODETYPE>* getNewNode(const NODETYPE &);
};
...................................................
...................................................
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
функция main
 
#include <iostream>
using namespace std;
#include "List.h"
 
int main(){
    List<char> L1;
    List<char> L2;
    char X;
    cout<<"введите 5 значений 1го листа \n";
    for(int i=0; i<5; i++){
        cin>>X;
        L1.insertAtBack(X);
    }
    cout<<"введите 5 значений 2го листа \n";
        for(int i=0; i<5; i++){
            cin>>X;
            L2.insertAtBack(X);
        }
    cout<<"\n";
    cout<<"элементы L1+L2 \n";
    L1.contenace(L1,L2);
    L1.print();
    cout<<"L1.firstPtr->data="<<L1.firstPtr->data;// ОШИБКА ЗДЕСЬ
    L1.clearList();
    return 0;
}
Вот что выдает компилятор:
18:58:40 **** Incremental Build of configuration Debug for project List ****
Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\List.o" "..\\src\\List.cpp"
In file included from ..\src\List.cpp:11:0:
..\src\List.h: In function 'int main()':
..\src\List.h:25:23: error: 'ListNode<char>* List<char>::firstPtr' is private
ListNode <NODETYPE>* firstPtr;
^
..\src\List.cpp:31:33: error: within this context
cout<<"L1.firstPtr->data="<<L1.firstPtr->data;
^
In file included from ..\src\List.h:5:0,
from ..\src\List.cpp:11:
..\src\ListNode.h:26:11: error: 'char ListNode<char>::data' is private
NODETYPE data;
^
..\src\List.cpp:31:43: error: within this context
cout<<"L1.firstPtr->data="<<L1.firstPtr->data;
^

Почему не возможно получит доступ к этим данным, класс List является другом класса ListNode, следовательно должен иметь доступ к закрытым членам.
Меня смущает, что указатель firstPtr имеет тип ListNode. Помогите понять чего я не догоняю!?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2016, 19:04
Ответы с готовыми решениями:

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

Перегрузка операторов и доступ к закрытым членам
Поясните, пожалуйста, почему, когда при перегрузке операторов, елис как аргумент передается ссылка...

Доступ к закрытым элементам класса - Вопрос
Доброго всем времени суток. Итак, столкнулся с одной непонятной вещью, связанной с классами, а...

Доступ к членам класса
Есть два класса: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class CPerson...

4
15254 / 8221 / 1993
Регистрация: 30.01.2014
Сообщений: 14,003
11.11.2016, 19:17 2
Лучший ответ Сообщение было отмечено Maximum_001 как решение

Решение

Цитата Сообщение от Maximum_001 Посмотреть сообщение
Почему не возможно получит доступ к этим данным, класс List является другом класса ListNode, следовательно должен иметь доступ к закрытым членам.
Только доступ-то пытается получить main, которая ему совсем не друг.
1
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
11.11.2016, 19:27  [ТС] 3
Я так и понял - надо через функции класса значит. Но ведь объект L1 имеет доступ к дата, через указатель firstPtr и это он вызывает значение дата. Мне казалось, что к main дружественность не имеет ни какого отношения, при рассмотрении в таком контексте.
0
15254 / 8221 / 1993
Регистрация: 30.01.2014
Сообщений: 14,003
11.11.2016, 19:50 4
Цитата Сообщение от Maximum_001 Посмотреть сообщение
Мне казалось, что к main дружественность не имеет ни какого отношения, при рассмотрении в таком контексте.
Доступ получает кто? main.
Член класса firstPtr в привате? да.
Какие могут быть вопросы?

Цитата Сообщение от Maximum_001 Посмотреть сообщение
Но ведь объект L1 имеет доступ к дата, через указатель firstPtr и это он вызывает значение дата.
Прежде всего, main пытается получить доступ к firstPtr.
0
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
11.11.2016, 19:50  [ТС] 5
Спасибо буду иметь ввиду теперь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2016, 19:50

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

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

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

Дружественная функция-оператор, доступ к закрытым полям класса
У меня есть класс MyClass, вот код: class MyClass { int x, y; public: MyClass(); friend...


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

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

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