2 / 1 / 1
Регистрация: 12.01.2018
Сообщений: 17
1

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

30.07.2019, 22:54. Показов 1804. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Проблема казалась тривиальной, но решить не получилось.
Допустим есть два класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Screen;
class Window_mgr {
    std::vector<Screen> screens{Screen(10,10,'y')};
public:
    typedef std::vector<Screen>::size_type index;
    void clear(index i);
};
 
class Screen {
public:
    Screen(int h, int w, char s) :height(h), width(w), contents(h* w, s) {}
    friend void Window_mgr::clear(index i);
    
private:
    pos cursor = 0, height = 0, width = 0;
    std::string contents;
};
void Window_mgr::clear(index i) {
    Screen& scr = screens[i];
    scr.contents = string(scr.width * scr.height, ' ');
}
Данный код не скомпилится, потому что создается объект типа, который не был определен, а лишь объявлен. Убрав первый элемент из вектора программа заработает. Второй вариант это переставить местами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Window_mgr;
class Screen {
public:
    Screen(int h, int w, char s) :height(h), width(w), contents(h* w, s) {}
    friend class Window_mgr;
    
private:
    pos cursor = 0, height = 0, width = 0;
    std::string contents;
};
class Window_mgr {
    std::vector<Screen> screens{Screen(10,10,'y')};
public:
    typedef std::vector<Screen>::size_type index;
    void clear(index i);
};
void Window_mgr::clear(index i) {
    Screen& scr = screens[i];
    scr.contents = string(scr.width * scr.height, ' ');
}
Но в этом случае фрэндом нужно делать весь класс. Можно как-нибудь получить дружественную функцию, и при этом чтобы создавался объект, или я слишком много хочу от плюсов?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2019, 22:54
Ответы с готовыми решениями:

Переопределение операторов как член-класса и как дружественная функция
Привет. Задача создать класс целых чисел, для него нужно переопределить операторы ++ и + как...

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

Дружественная функция
Здравствуйте. Написал программу, которая должна матрицу умножать на число, но я не понимаю как...

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

2
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
30.07.2019, 23:06 2
Лучший ответ Сообщение было отмечено Artvan как решение

Решение

Artvan,
screen.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef SCREEN_H_INCLUDED
#define SCREEN_H_INCLUDED
 
//........
 
#include <string>
#include "window_mgr.h"
 
class Screen {
public:
    Screen(int h, int w, char s) :height(h), width(w), contents(h* w, s) {}
 
    friend void Window_mgr::clear(index i);
 
private:
    pos cursor = 0, height = 0, width = 0;
    std::string contents;
};
 
#endif // SCREEN_H_INCLUDED

window_mgr.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include "window_mgr.h"
#include "screen.h"
 
Window_mgr::Window_mgr()
    : screens{ Screen(10,10,'y') }
{ }
 
void Window_mgr::clear(index i) {
    Screen& scr = screens[i];
    scr.contents = std::string(scr.width * scr.height, ' ');
}

window_mgr.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef WINDOW_MGR_H_INCLUDED
#define WINDOW_MGR_H_INCLUDED
 
#include <vector>
 
class Screen;
 
class Window_mgr {
    std::vector<Screen> screens;
public:
    Window_mgr();
 
    typedef std::vector<Screen>::size_type index;
    void clear(index i);
};
 
#endif // WINDOW_MGR_H_INCLUDED


Добавлено через 2 минуты
Ну или как у вас было:
Кликните здесь для просмотра всего текста
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
class Screen;
class Window_mgr {
    std::vector<Screen> screens;
public:
    Window_mgr();
 
    typedef std::vector<Screen>::size_type index;
    void clear(index i);
};
 
class Screen {
public:
    Screen(int h, int w, char s) :height(h), width(w), contents(h* w, s) {}
    friend void Window_mgr::clear(index i);
 
private:
    size_t cursor = 0, height = 0, width = 0;
    std::string contents;
};
 
Window_mgr::Window_mgr()
    : screens{ Screen(10,10,'y') }
{ }
 
void Window_mgr::clear(index i) {
    Screen& scr = screens[i];
    scr.contents = std::string(scr.width * scr.height, ' ');
}
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
30.07.2019, 23:11 3
Цитата Сообщение от Artvan Посмотреть сообщение
или я слишком много хочу от плюсов?
Хочется вспомнить что-то вроде
Цитата Сообщение от скрижали
Не спрашивайте всех о том, что си плюс плюс сделал для того, чтобы вы его поняли. Спрашивайте себя о том, что вы сделали, чтобы понять си плюс плюс
C++
1
2
3
4
void Window_mgr::clear(index i) {
    Screen& scr = screens[i];
    scr.contents = string(scr.width * scr.height, ' ');
}
contents - приватное поле. Или сделайте публичный метод доступа - сеттер или работайте через оператор . получая прямую ссылку. Во втором случае дружба, это то что нужно. Но акзессор лучше. Можно что-то проверить, и позвать хозяина, если не нравится.
1
30.07.2019, 23:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2019, 23:11
Помогаю со студенческими работами здесь

Дружественная функция
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; class massiv { int len,*p_mas;...

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

Дружественная функция c++
Никак не пойму, как заставить void M заработать, хелп. Не видит переменные. #include &lt;string&gt;...

Не вызывается дружественная функция
Создал класс, есть дружественная функция: int NOD(int a,int b) { while(b) { ...


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

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

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