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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Возведение числа типа int в степень http://www.cyberforum.ru/cpp-beginners/thread1523293.html
Здравствуйте. int n = 2; int x = 2; while (n) { n = x * n; cout << n << endl; }
C++ Поиск нескольких элементов массива/вектора Всем доброго времени суток. После нескольких часов безуспешного мозгового штурма и интернет-серфинга решил задать вопрос здесь. Попытаюсь ясно сформулировать. У меня есть несколько переменных. Пусть это буду x,y,z. Есть несколько массивов A, B, C. В этих массивах различные переменные, но среди них есть те самые x y z. Только в одном массиве, например, есть только x, в другом только y. Мне надо... http://www.cyberforum.ru/cpp-beginners/thread1523291.html
C++ Перевод массива десятичных чисел в двоичный код
Есть такого вида код: #include <iostream> using namespace std; int i,j; void main() { setlocale(0, ""); int a, b; cout << "Введите число в dec: "; for (i = 0; i < 2; i++) cin >> a; cout << endl;
C++ Динамическое выделение памяти - сделать так, чтобы переменная стала видимой во всем коде
У меня вопрос в том как сделать так чтобы plus стал видимым во всем коде а не только в блоке. Дело в том что мне нужно чтобы его размер менялся только в том случае если условие выполнялось и как тогда в таком случае применять delete plus; #include<iostream> int main() { int N; std::cout<<"Enter the number of entries in the log: "; std::cin>>N; int* ps = new int; char* p = new char;
C++ Быстрая сортировка двумерного массива http://www.cyberforum.ru/cpp-beginners/thread1523254.html
Здравствуйте. У меня есть задание по сортировкам. Нужно заданный двумерный массив из рандомных чисел отсортировать по возрастанию по строкам. Прошу помочь только с быстрой сортировкой. Там выдает несколько ошибок, связанных с указателями, а я в них пока не так силён. Функция рекурсивная, поэтому немного запутался. Буду очень благодарен за помощь. #include <iostream> #include <stdio.h>...
C++ Переставить местами четные и нечетные элементы в массиве Здравствуйте уважаемые форумчани!Прошу с задачей мне помочь,нужно переставить местами четные и нечетные элементы в массиве.Например:(до) 1,2,3,4 (после) 2,1,4,3 вот код: #include<iostream> using namespace std; int *str=new int; int n=1; void sort(int *num) { int b,i; bool c; подробнее

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

Изучаю 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 11:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru