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

Friend функции не имеют доступ к закрытым переменным - C++

Восстановить пароль Регистрация
 
Leonman
 Аватар для Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 266
02.09.2015, 01:44     Friend функции не имеют доступ к закрытым переменным #1
Всем привет.

Изучаю c++ по Липпману 5-ое издание. Там на стр. 351-352 используются friend функции для получения доступа к закрытым переменным. Выглядит все это так:
Кликните здесь для просмотра всего текста
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
#ifndef SALESDATA_H_INCLUDED
#define SALESDATA_H_INCLUDED
 
#include <string>
#include <iostream>
 
class SalesData
{
friend SalesData add(const SalesData &, const SalesData &);
friend std::ostream &print(std::ostream &, const SalesData &);
friend std::istream $read(std::istream &, SalesData &);
 
public:
        SalesData() = default;
        SalesData(const std::string &s) : bookNo(s) {}
        SalesData(const std::string &s, unsigned n, double p) :
                  bookNo(s), units_sold(n), revenue(p*n) {}
        SalesData(std::istream &);
        std::string isbn() const {return bookNo;}
        SalesData &combine(const SalesData &);
private:
        double avg_price() const {return units_sold ? revenue/units_sold : 0;}
        std::string bookNo;
        unsigned units_sold = 0;
        double revenue = 0.0;
};
 
SalesData add(const SalesData &, const SalesData &);
std::ostream &print(std::ostream &, const SalesData &);
std::istream $read(std::istream &, SalesData &);
 
#endif


Кликните здесь для просмотра всего текста
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
#include "../include/SalesData.h"
 
using std::istream;
using std::ostream;
 
SalesData &SalesData::combine(const SalesData &sd)
{
        units_sold += sd.units_sold;
        revenue += sd.revenue;
 
        return *this;
}
 
istream &read(istream &is, SalesData &item)
{
        double price = 0;
        is >> item.bookNo >> item.units_sold >> price;
        item.revenue = price * item.units_sold;
 
        return is;
}
 
ostream &print(ostream &os, const SalesData &item)
{
        os << item.isbn() << " " << item.units_sold << " "
           << item.revenue << " " << item.avg_price();
 
        return os;
}
 
SalesData add(const SalesData &item1, const SalesData &item2)
{
        SalesData sum = item1;
        sum.combine(item2);
 
        return sum;
}
 
SalesData::SalesData(istream &is) {read(is, *this);}


Компилирую следующей командой:
Код
d:\C++\PrimerCPP_Projects\dataStructures\class\SalesData\src>g++ -Wall -Wextra -Werror -std=c++11 -c ../include/SalesData.h SalesData.cpp
И получаю ошибки:
Кликните здесь для просмотра всего текста
Код
../include/SalesData.h: In function 'std::istream& read(std::istream&, SalesData&)':
../include/SalesData.h:23:14: error: 'std::string SalesData::bookNo' is private
  std::string bookNo;
              ^
SalesData.cpp:17:13: error: within this context
  is >> item.bookNo >> item.units_sold >> price;
             ^
../include/SalesData.h:24:24: error: 'unsigned int SalesData::units_sold' is private
  unsigned units_sold = 0;
                        ^
SalesData.cpp:17:28: error: within this context
  is >> item.bookNo >> item.units_sold >> price;
                            ^
../include/SalesData.h:25:19: error: 'double SalesData::revenue' is private
  double revenue = 0.0;
                   ^
SalesData.cpp:18:7: error: within this context
  item.revenue = price * item.units_sold;
       ^
../include/SalesData.h:24:24: error: 'unsigned int SalesData::units_sold' is private
  unsigned units_sold = 0;
                        ^
SalesData.cpp:18:30: error: within this context
  item.revenue = price * item.units_sold;
                              ^


Не могу понять, в чем ошибка.

P.S. у меня gcc 4.8.2
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2015, 01:44     Friend функции не имеют доступ к закрытым переменным
Посмотрите здесь:

C++ Перегрузка операторов и доступ к закрытым членам
C++ Доступ из статической функции к не стачисеским переменным
C++ Доступ к закрытым элементам класса - Вопрос
Доступ к переменным C++
C++ Доступ к закрытым членам базового класса
C++ friend функции не имеют доступа к private элементам класса, почему?
Доступ к закрытым методом класса! C++
Дружественная функция-оператор, доступ к закрытым полям класса C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Velesthau
523 / 425 / 129
Регистрация: 25.11.2014
Сообщений: 1,662
02.09.2015, 02:15     Friend функции не имеют доступ к закрытым переменным #2
Привет.

Цитата Сообщение от Leonman Посмотреть сообщение
friend std::istream $read(std::istream &, SalesData &);
$ в строке в имени функции.
Leonman
 Аватар для Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 266
02.09.2015, 02:24  [ТС]     Friend функции не имеют доступ к закрытым переменным #3
Velesthau, мда. Спасибо
Yandex
Объявления
02.09.2015, 02:24     Friend функции не имеют доступ к закрытым переменным
Ответ Создать тему
Опции темы

Текущее время: 20:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru