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

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

Войти
Регистрация
Восстановить пароль
 
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
#1

Поля дружественного класса - C++

11.12.2012, 17:55. Просмотров 625. Ответов 12
Метки нет (Все метки)

есть примерно такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class ClientAuthorization
{
public:
    int count; //считается в конструкторе, не буду писать весь код, а то много получится
    friend class Role;
    void Function();
};
void ClientAuthorization::Function()
{
    for(int i=0; i<count; i++)
        cout<<Role::name[i];
}
class Role
{
public:
    vector <string> name;
}
пишет "name" не объявленный идентификатор. почему я не могу получить доступ к полям дружественного класса?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2012, 17:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поля дружественного класса (C++):

Вызов функций класса Dictionary функциями дружественного класса - C++
Функции класса Tree используют функции дружественного класса Dictionary,но вылетают ошибки,не находятся определения функций класа...

Объявление дружественного класса внутри класса - C++
class A{ friend class B{ B(A &amp;a); } } Подскажите пожалуйста, такое возможно или нет, я хотел чтобы...

Метод дружественного класса - C++
Нужно сделать такую ​​задачу, но дойшовшы к этому: выбрать заданное число N абитуриентов, имеющих высокий средний балл (метод...

Использование дружественного класса - C++
Нужно что бы классы стали общее дружеские вложенные классы поидее в книге написано можно добавить всего лишь к примеру friend class Remote;...

Вызов функций дружественного класса - C++
У меня есть 2 класса Tree и Dictionary,которые являются друзьями class Tree; class Dictionary { friend class Tree; class...

Объявление дружественного класса в приватной области - C++
class A { public: A(){} private: void Alg(){} friend class B; };

12
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
11.12.2012, 17:59 #2
Невнимательный я) Определение Role должно быть доступно.

Добавлено через 2 минуты
До обращения к name.
0
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
11.12.2012, 18:03  [ТС] #3
Цитата Сообщение от gray_fox Посмотреть сообщение
Невнимательный я) Определение Role должно быть доступно.

Добавлено через 2 минуты
До обращения к name.
у меня каждый класс объявлен в отдельном хедере, и соответственно функции в отдельном цпп.
как быть? надо ли в ClientAuthorization.cpp добавить #include "Role.h"?
0
go
Эксперт С++
3586 / 1366 / 129
Регистрация: 16.04.2009
Сообщений: 4,528
11.12.2012, 18:04 #4
Цитата Сообщение от Tiva Посмотреть сообщение
Role::name[i];
Через точку.
1
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
11.12.2012, 18:06  [ТС] #5
в ClientAuthorization.cpp добавил #include "Role.h"
теперь ошибки такие:
Код
1>clientauthorization.cpp(98) : error C2597: недопустимая ссылка на нестатический член 'Role::name'
1>clientauthorization.cpp(98) : error C3867: Role::name: в вызове функции отсутствует список аргументов; используйте "&Role::name" для создания указателя на член
1>clientauthorization.cpp(98) : error C2109: для индекса требуется массив или указатель
0
go
Эксперт С++
3586 / 1366 / 129
Регистрация: 16.04.2009
Сообщений: 4,528
11.12.2012, 18:06 #6
Ах да. И смысла в дружественном классе нет.
0
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
11.12.2012, 18:07  [ТС] #7
Цитата Сообщение от go Посмотреть сообщение
Через точку.
если оставить #include "Role.h"
то выдает
Код
clientauthorization.cpp(98) : error C2275: Role: недопустимое использование этого типа в качестве выражения
если убрать этот инклюд, то вот такие ошибки:
Код
clientauthorization.cpp(98) : error C2027: использование неопределенного типа "Role"
clientauthorization.cpp(98) : error C2228: выражение слева от ".name" должно представлять класс, структуру или объединение
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
11.12.2012, 18:08 #8
Цитата Сообщение от Tiva Посмотреть сообщение
почему я не могу получить доступ к полям дружественного класса?
Друг имеет доступ , но не наоборот. В любом случае это тут не причём - name всё равно в открытом доступе.
0
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
11.12.2012, 18:09  [ТС] #9
почему нет смысла в дружественном классе?
мне надо иметь доступ к полям одного класса в другом, без объявления экземпляров 2-ого класса, в 1-ом.
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
11.12.2012, 18:10 #10
Цитата Сообщение от Tiva Посмотреть сообщение
выражение слева от ".name" должно представлять класс, структуру или объединение
Т.к. поле не статическое нужен объект класса.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7512 / 4644 / 700
Регистрация: 29.11.2010
Сообщений: 12,680
11.12.2012, 18:12 #11
Tiva, а если б у тебя был массив Role, то какое из name требовалось бы взять?
Либо делай name static, либо так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Role
{
public:
    vector <string> name;
};
 
class ClientAuthorization
{
public:
    int count; //считается в конструкторе, не буду писать весь код, а то много получится
    friend class Role;
    void Function(Role);
};
void ClientAuthorization::Function(Role r)
{
    for(int i=0; i<count; i++)
        cout<<r.name[i];
}
1
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
11.12.2012, 18:14  [ТС] #12
спасибо, вроде разобрался
0
go
Эксперт С++
3586 / 1366 / 129
Регистрация: 16.04.2009
Сообщений: 4,528
11.12.2012, 22:04 #13
Цитата Сообщение от Tiva Посмотреть сообщение
Сообщение от go Через точку. если оставить #include "Role.h"
то выдает
Я Вам еще раз говорю - обращайтесь через точку.

Добавлено через 3 часа 38 минут
Цитата Сообщение от Tiva Посмотреть сообщение
почему нет смысла в дружественном классе?
Потому что.
Цитата Сообщение от Tiva Посмотреть сообщение
мне надо иметь доступ к полям одного класса в другом, без объявления экземпляров 2-ого класса, в 1-ом.
Сделайте их статическими.
0
11.12.2012, 22:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2012, 22:04
Привет! Вот еще темы с ответами:

Доступ дружественного оператора к приватным данным класса - C++
Здравствуйте. тока начал изучение С++; составляю прогу практически по учебнику - реализация класса Стринг при компиляции компилятор...

Перенести методы дружественного класса в подключаемый файл - C++
Добрые люди, в отчаянии прошу помощи. Голова уже пухнет, не могу понять что куда откуда и как. Необходимо перенести описание всех методов...

Написание дружественного оператора >> для Класса "Wine" с private родителем - C++
Изучаю С++ по Прате. В задание столкнулся с проблемой написания дружественного оператора&gt;&gt; для Класса &quot;Wine&quot; с private родителем ...

Использование в качестве поля класса указатель на объект другого класса - C++
Ошибка в названии - &quot;указателЯ&quot; Вот, пытаюсь освоить ООП (пока только учусь): создаю класс person (человек) и car (модель машины). ...


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

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

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