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

friend функции не имеют доступа к private элементам класса, почему? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Поменять местами строки http://www.cyberforum.ru/cpp-beginners/thread947257.html
В данной вещественной матрице порядка 6х9 поменять местами строку, содержащую элемент с наибольшем значением, со строкой, содержащий элемент с наименьшим значением. Предполагается что эти элементы единственные. Затрудняюсь как строки поменять,помогите пожалуйста.
C++ c++ for_each и вызов функции for(microbe &i : microbes) { i.set_speed(diapozon_speed * rand() /RAND_MAX + min_speed ); // установка скорости int nr = rand() % rings.size(); i.set_ring(rings); i.set_XY(create_point(nr)); i.set_target(create_point(nr)); } http://www.cyberforum.ru/cpp-beginners/thread947254.html
Крестики нолики C++
Доброго времени суток, недавно я решил написать игру крестики нолики, написал, но код в ~1300 строк, что очень много, в коде много похожих операций, но они только похожи, на самом деле они все разные, поэтому я не могу придумать функцию. вот примеры case 1:{ Movies = 'O'; switch(FourthMove){ ...
Читать слова по одному за раз, пока не будет введена буква q C++
Необходимо написать программу, которая читает слова по одному за раз, пока не будет введена буква q. После этого программа должна сообщить, количество слов, начинающихся с гласных, количество слов, начинающихся с согласных и количество слов, которые начинаются с других символов (например с цифр). Программа упрямо не хочет считать буквы в верхнем регистре, в нижнем иногда выдает правильно,...
C++ Подскажите литературу http://www.cyberforum.ru/cpp-beginners/thread947215.html
Подскажите пожалуйста книгу по математической логике, только что нибудь полегче Кнута "искуство программирования", потому что Кнут очень тяжко идет). И вообще литературу по обработке массивов.
C++ Как генерить монотонно возрастающие числа? Привет! Суть проблемы такова. Надо генерить длинные (long long) числа, чтоб они были всё время разные и плавно возрастающие. Генериться они должны всегда правильно, вне зависимости от того, сколько раз подряд была запущенна программа, сколько раз компьютер был перезагружен и тд... Понятно, что в принципе тут надо завязываться на дату, но тут так же возникает проблема - если этот генератор... подробнее

Показать сообщение отдельно
Oman
4 / 4 / 0
Регистрация: 07.11.2010
Сообщений: 29
02.09.2013, 15:30     friend функции не имеют доступа к private элементам класса, почему?
Учусь по Лафоре Р. - Объектно-ориентированное программирование в С++ (Классика Computer Science) - 2004.
Выполняю задания на Microsoft Visual C++ 6.0. И уже встречаю 2ой раз такую проблему. Если функция - это перегруженный оператор, то дружелюбность не работает, а если простая функция типа show(), дружелюбность работает.
В чем проблема?
Вот например проблемный класс:
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
class person
{
private:
    string lastName;
    string firstName;
    long phoneNumber;
public:
    person() :             // конструктор по умолчанию
      lastName("пусто"), firstName("пусто"), phoneNumber(0L)
      {  }
 
      // конструктор с тремя аргументами
      person(string lana, string fina, long pho) :
      lastName(lana), firstName(fina), phoneNumber(pho)
      {  }
 
      friend bool operator<(const person&, const person&);
      friend bool operator==(const person&, const person&);
 
      void display() const   // вывод персональных данных
      {
          cout << endl << lastName << ",\t" << firstName
              << "\t\tТелефон: " << phoneNumber;
      }
 
      long get_phone() const // вернуть телефонный номер
      { return phoneNumber; }
}; // end class person
//---------------------------------------------------------
// перегруженный < для класса person
bool operator<(const person& p1, const person& p2)
{
    if(p1.lastName == p2.lastName)
        return (p1.firstName < p2.firstName) ? true : false;
    return (p1.lastName < p2.lastName) ? true : false;
}
//---------------------------------------------------------
// перегруженный == для класса person
bool operator==(const person& p1, const person& p2)
{
    return (p1.lastName == p2.lastName &&
        p1.firstName == p2.firstName) ? true : false;
}
Ошибки:
Кликните здесь для просмотра всего текста
--------------------Configuration: 15x4 - Win32 Debug--------------------
Compiling...
multimnozh_person.cpp
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(47) : error C2248: 'lastName' : cannot access private member declared in class 'person'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(18) : see declaration of 'lastName'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(47) : error C2248: 'lastName' : cannot access private member declared in class 'person'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(18) : see declaration of 'lastName'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(48) : error C2248: 'firstName' : cannot access private member declared in class 'person'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(19) : see declaration of 'firstName'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(48) : error C2248: 'firstName' : cannot access private member declared in class 'person'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(19) : see declaration of 'firstName'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(49) : error C2248: 'lastName' : cannot access private member declared in class 'person'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(18) : see declaration of 'lastName'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(49) : error C2248: 'lastName' : cannot access private member declared in class 'person'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(18) : see declaration of 'lastName'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(55) : error C2248: 'lastName' : cannot access private member declared in class 'person'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(18) : see declaration of 'lastName'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(55) : error C2248: 'lastName' : cannot access private member declared in class 'person'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(18) : see declaration of 'lastName'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(56) : error C2248: 'firstName' : cannot access private member declared in class 'person'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(19) : see declaration of 'firstName'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(56) : error C2248: 'firstName' : cannot access private member declared in class 'person'
D:\Files\Other\INFA\Cpp\Task\15x4\multimnozh_person.cpp(19) : see declaration of 'firstName'
Error executing cl.exe.

15x4.exe - 10 error(s), 0 warning(s)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 09:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru