25 / 25 / 11
Регистрация: 15.10.2013
Сообщений: 880
1

Не работают friend функции

18.01.2016, 17:53. Показов 1791. Ответов 2

Есть класс Student, где объявлены дружественные функции:
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
#pragma once
#include <iostream>
#include <string>
#include <valarray>
 
class Student
{
    typedef std::valarray<double> ArrayDb;
    std::string name;
    ArrayDb scores;
 
    std::ostream & arr_out(std::ostream & os) const;
public:
 
    Student() :name("Null Student"), scores() {};
    explicit Student(const std::string & s) : name(s), scores() {};
    explicit Student(int n) : name("Nully"), scores(n) {};
    Student(const std::string & s, int n) :name(s), scores(n) {};
    Student(const char * str, const double * pd, int n) :name(str), scores(pd, n) {};
    ~Student() {};
    double Average()const;
    const std::string & Name() const;
    double & operator[](int i);
    double operator[](int i)const;
 
 
// ДРУЖЕСТВЕННЫЕ ФУНКЦИИ:
    friend std::istream & operator>>(std::istream * is, Student & stu); // 1 word
    friend std::istream & getline(std::istream * is, Student & stu); // 1 string
 
    friend std::ostream & operator<<(std::ostream * os, const Student & stu);
 
};

Но в cpp файле в этих функциях нету доступа к приват-членам класса:

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
#include "stdafx.h"
#include "Student.h"
using std::ostream;
using std::endl;
using std::istream;
using std::string;
 
//........куча функций (я их удалил, что бы не мешали) 
 
ostream & Student::arr_out(ostream & os) const
{
    int i;
    int lim = scores.size();
    if (lim > 0)
    {
        for (i = 0; i < lim; ++i)
        {
            os << scores[i] << " ";
            if (i % 5 == 4)
                os << endl;
        }
        if (i % 5 != 0)
            os << endl;
    }
    else
        os << " empty array ";
    return os;
}
 
istream & operator>>(istream & is, Student & stu)
{
    is >> stu.name; //подсвечивает name, пишет: ('Student::name': cannot access private member declared in class 'Student' )
    return is;
}
 
istream & getline(istream & is, Student & stu)
{
    getline(is, stu.name); // тоже самое тут
    return is;
}
 
ostream & operator<<(ostream & os, const Student & stu)
{
    os << "Scores for " << stu.name << ":\n"; // тоже самое тут
    stu.arr_out(os); // тут аналогично, только по поводу закрытого метода arr_out
    return os;
}
ПОЧЕМУ так происходит, ведь в .h-файле я объявил эти функции дружественными?!

П.С. данный код класса взят с книги Пратта С. Язык программирования С++ (2011).
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.01.2016, 17:53
Ответы с готовыми решениями:

Перегрузка операторов, friend или нет friend?
Всем здравствуйте. Есть такой вопрос: при перегрузке операторов в классе(пусть будут + и = (вообще...

Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов pri
Братаны, выручайте! Общая постановка. Пользовательский класс Х должен содержать необходимые...

Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов prin
Братаны, выручайте!:help: Общая постановка. Пользовательский класс Х должен содержать необходимые...

Friend-функции
из теории ясно, что friend функция — это функция, которая не является членом класса, но имеет...

2
16079 / 8681 / 2120
Регистрация: 30.01.2014
Сообщений: 14,960
18.01.2016, 17:57 2
Цитата Сообщение от andreyananas Посмотреть сообщение
ПОЧЕМУ так происходит
В объявлении указатель на istream\ostream, а в определении ссылка.
В объявлении исправь на ссылку.
1
25 / 25 / 11
Регистрация: 15.10.2013
Сообщений: 880
18.01.2016, 18:05  [ТС] 3
Ох я и баран... Видимо по амперсанду не попал, надо свет включить))) Спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.01.2016, 18:05
Помогаю со студенческими работами здесь

Дружественные (friend) функции
Доброго времени суток. Кратко о сути: Имеются 2 класса - Float (представляет собой число типа...

Реализация friend функции
Есть код. Нужно реализовать вывод ответа через friend. Подскажите пожалуйста как это сделать?...

friend и member функции
Народ, объясните пожалуйста как пишутся данные функции, принцип их написания, откуда что берется. И...

Реализация дружественной (friend) функции
Всем доброго времени суток. Хотел бы попросить помощи, ибо запутался. Задачи состоит в том, чтобы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru