Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
1472 / 936 / 809
Регистрация: 30.04.2016
Сообщений: 3,253
1

Дружественная функция и приватные члены класса

22.02.2019, 14:18. Показов 1360. Ответов 43
Метки нет (Все метки)

Здравствуйте, уважаемые форумчане! Подскажите, пожалуйста, можно ли как-то в коде ниже сделать переменные класса приватными, а не публичными. У меня пока выдает ошибку. Вот код:

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
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <string>
#include <fstream>
 
    using namespace std;
 
class ConsumerBasket {
 
    //private: не срабатывает
    public:
 
        string p_name;
        int c_rate;
        double p_price;
    
    public:
  
        friend ofstream& operator<<(ofstream &out, const ConsumerBasket &obj);  
};
 
    ofstream& operator<<(ofstream &out, const ConsumerBasket &obj) {
          out << obj.p_name << " "
            << obj.c_rate << " "
            << obj.p_price << "\n";
        return out;
    }
 
int main() {
    ifstream in("input.txt");
    ofstream out("output.txt");
    int n;
    double sum;
    in >> n;
    ConsumerBasket* goods = new ConsumerBasket[n];
    sum = 0.0;
    for (int i = 0; i < n; i++) {
        in >> goods[i].p_name >> goods[i].c_rate >> goods[i].p_price;
        sum += goods[i].p_price;
    }
    for (int i = 0; i < n; i++) {
          for (int j = n - 1; j > i; j--) {
              if (goods[j].p_price < goods[j-1].p_price) {
                  swap(goods[j], goods[j-1]);
              }
          }
    }
    cout << "Output of the program:\n";
    cout << "Total price: " << sum << "\n";
    for (int i = 0; i < n; i++) {
          out << goods[i];
    }
    in.close();
    out.close();
    cin.get();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.02.2019, 14:18
Ответы с готовыми решениями:

Дружественная функция класса
Проблема в том что дружественная функция класа механик в класе car (friend void update_status) не...

Глобальная функция + приватные переменные + вызов из другого класса?
Всем добрый день. Помогите разобраться. Получаю определенные параметры и пытаюсь их сохранить в...

Шаблон класса и дружественная функция
Доброго времени суток. Столкнулся с непониманием одного процесса. Задача звучит следующим образом:...

Дружественная шаблонная функция шаблонного класса
Не компилируется. Подскажите правильный синтаксис. template&lt;typename T&gt; class A;...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
43
"C with Classes"
1627 / 1251 / 474
Регистрация: 16.08.2014
Сообщений: 5,240
Записей в блоге: 1
22.02.2019, 14:24 2
Fixer_84,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class ConsumerBasket {
 
    private:
 
        string p_name;
        int c_rate;
        double p_price;
    
    public:
  
        void SetString(const string& s) {p_name = s;} 
        string GetString() {return p_name;} const
};
 
    ofstream& operator<<(ofstream &out, const ConsumerBasket &obj) {
          out << obj.GetString();
        return out;
    }
остальные поля по аналогии
1
258 / 108 / 53
Регистрация: 22.01.2017
Сообщений: 435
22.02.2019, 15:09 3
Fixer_84, еще вариант:
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
 
using namespace std;
 
class ConsumerBasket {
private:
    string p_name;
    int c_rate;
    double p_price;
 
public:
    ConsumerBasket(string name, int rate, double price) : p_name(name)
                                                        , c_rate(rate)
                                                        , p_price(price) {}
    double getPrice() { return p_price; }
    friend ofstream& operator<<(ofstream &out, const ConsumerBasket &obj);
};
 
ofstream& operator<<(ofstream &out, const ConsumerBasket &obj) {
    out << obj.p_name << " "
        << obj.c_rate << " "
        << obj.p_price << "\n";
    return out;
}
 
int main() {
    ifstream in("input.txt");
    ofstream out("output.txt");
    unsigned n;
    double sum;
    in >> n;
    vector<ConsumerBasket> goods;
    sum = 0.0;
    for(unsigned i = 0; i < n; ++i) {
        string name;
        int rate;
        double price;
        in >> name >> rate >> price;
        sum += price;
        ConsumerBasket obj(name, rate, price);
        goods.push_back(obj);
    }
 
    for(unsigned i = 0; i < n; ++i) {
        for(unsigned j = n - 1; j > i; ++j) {
            if (goods[j].getPrice() < goods[j - 1].getPrice()) {
                swap(goods[j], goods[j - 1]);
            }
        }
    }
    cout << "Output of the program:\n";
    cout << "Total price: " << sum << "\n";
    for(unsigned i = 0; i < n; ++i) {
        out << goods[i];
    }
    in.close();
    out.close();
    cin.get();
    return 0;
}
1
"C with Classes"
1627 / 1251 / 474
Регистрация: 16.08.2014
Сообщений: 5,240
Записей в блоге: 1
22.02.2019, 15:19 4
Цитата Сообщение от Fixer_84 Посмотреть сообщение
У меня пока выдает ошибку.
кстати у тебя с кодам все нормально вроде какую ошибку пишет?
1
258 / 108 / 53
Регистрация: 22.01.2017
Сообщений: 435
22.02.2019, 15:21 5
_stanislav, он при private имеет в виду ошибку
1
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
22.02.2019, 15:25 6
Fixer_84, C++17
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
#include <iostream>
#include <tuple>
 
class ConsumerBasket {
public:
    ConsumerBasket(std::string const& name, int const rate, double const price) noexcept
            : p_name(name), c_rate(rate), p_price(price) {}
 
    std::tuple<std::string, int, double> data() const noexcept { return {p_name, c_rate, p_price}; }
 
private:
    // интересные префиксы офк
    std::string p_name;
    int         c_rate;
    double      p_price;
};
 
ofstream& operator<<(ofstream& out, const ConsumerBasket& obj) {
    out << obj.GetString();
    return out;
}
 
int main()
{
    ConsumerBasket cb("asd", 10, 3.14);
    auto const [name, rate, price] = cb.data();
    std::cout << name << " " << rate << " " << price;
}
1
1472 / 936 / 809
Регистрация: 30.04.2016
Сообщений: 3,253
22.02.2019, 15:42  [ТС] 7
_stanislav, здравтсвуйте. Спасибо за ваш ответ. К сожалению, не помогает. Или если вы уверены, то покажите, пожалуйста, весь код, который будет рабочим. У меня пока не выходит.
0
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
22.02.2019, 15:43 8
Или так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ConsumerBasket {
private:
    struct data_t {
        std::string name;
        int         rate;
        double      price;
    };
 
    data_t data_;
 
public:
    ConsumerBasket(std::string const& name, int const rate, double const price) noexcept : data_({name, rate, price}) {}
 
    data_t data() const noexcept { return data_; }
};
 
 
int main()
{
    ConsumerBasket cb("asd", 10, 3.14);
    std::cout << cb.data().name << " " << cb.data().rate << " " << cb.data().price;
}
1
"C with Classes"
1627 / 1251 / 474
Регистрация: 16.08.2014
Сообщений: 5,240
Записей в блоге: 1
22.02.2019, 15:43 9
Azazel-San, функции noexcept ?
1
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
22.02.2019, 15:45 10
Цитата Сообщение от _stanislav Посмотреть сообщение
Azazel-San, функции noexcept ?
Ну там она одна и да.
1
"C with Classes"
1627 / 1251 / 474
Регистрация: 16.08.2014
Сообщений: 5,240
Записей в блоге: 1
22.02.2019, 15:46 11
Цитата Сообщение от Azazel-San Посмотреть сообщение
Ну там она одна и да.
почему? зачем?
1
1472 / 936 / 809
Регистрация: 30.04.2016
Сообщений: 3,253
22.02.2019, 15:49  [ТС] 12
_stanislav, возможно вы все сделали правильно. Просто пишу с планшета и в CCTools. Может, не хватает стандарта. Вечером посмотрю и отпишусь всем.
0
"C with Classes"
1627 / 1251 / 474
Регистрация: 16.08.2014
Сообщений: 5,240
Записей в блоге: 1
22.02.2019, 15:50 13
Fixer_84, не понятно почему у тебя твой код не работает, попробуй этот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Class
{
private:
    int i;
 
public:
    friend std::ostream& Show(std::ostream& o, const Class&);
};
 
std::ostream& Show(std::ostream& o, const Class& c)
{
    o << c.i;
    return o;
}
тут все работает.
1
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
22.02.2019, 15:50 14
Цитата Сообщение от _stanislav Посмотреть сообщение
почему? зачем?
Ну по конструктору надеюсь объяснять не надо?
А геттер noexcept - потому что (возьмите Скотта Мейерса почитайте, он это описывает, ато меня опять обвинят что я плохо объясняю).
1
"C with Classes"
1627 / 1251 / 474
Регистрация: 16.08.2014
Сообщений: 5,240
Записей в блоге: 1
22.02.2019, 15:52 15

Не по теме:

Цитата Сообщение от Azazel-San Посмотреть сообщение
ато меня опять обвинят что я плохо объясняю
забей

1
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
22.02.2019, 15:54 16

Не по теме:

Цитата Сообщение от _stanislav Посмотреть сообщение
забей
Да и дело не благородное)) Если просто и кратко ответить, то я в своей функции никаких исключений не бросаю и не буду, тогда почему бы и нет?)


1
Azazel-San
22.02.2019, 15:54
  #17

Не по теме:

Спасибо за лаги и дубликацию сообщений.

0
"C with Classes"
1627 / 1251 / 474
Регистрация: 16.08.2014
Сообщений: 5,240
Записей в блоге: 1
22.02.2019, 15:58 18
Цитата Сообщение от Fixer_84 Посмотреть сообщение
У меня пока выдает ошибку.
возможно ты пропустил это #include <fstream>

Добавлено через 1 минуту
Цитата Сообщение от Azazel-San Посмотреть сообщение
тогда почему бы и нет?)
а другие будут бросать?

Добавлено через 1 минуту
в смысле объект созданные тобой в конструкторе
1
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
22.02.2019, 16:00 19
Цитата Сообщение от _stanislav Посмотреть сообщение
а другие будут бросать?
std::tuple если не ошибаюсь может кинуть, но я типо don't care (я взял ответственность на себя, а геттер слишком простая функция что бы заботится об этом) и согласен если че в терминейт (который никогда не случится).
А во втором случае с вложенным классом, никто не будет.
1
258 / 108 / 53
Регистрация: 22.01.2017
Сообщений: 435
22.02.2019, 16:02 20
Не пойму о чем речь? Как может сработать запись напрямую в приватное поле?
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.02.2019, 16:02

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Дружественная статическая функция из другого класса
у меня есть класс Info , объект которого имеет поля ключ и значение , оба типа std::string...

Дружественная функция-оператор, доступ к закрытым полям класса
У меня есть класс MyClass, вот код: class MyClass { int x, y; public: MyClass(); friend...

Преобразование типа аргумента в тип класса и дружественная функция
Добрый день. Есть код: class Cls { private: double x; public: Cls(); Cls(double);

Дружественная функция не может получить доступ к приватным данным класса
Доброго времени суток уважаемые форумчане), пытаюсь реализовать дружественную функцию которая берет...

Почему дружественная функция не может обратиться к protected полю класса?
Не могу понять, почему функция не может обратиться к protected полю класса: class Ships {...

Почему дружественная функция с перегруженным оператором << не имеет доступа к данным класса?
В заголовочном файле &quot;klass.h&quot; есть класс: class klass { int x; public: klass(); ~klass();...


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

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

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