С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
18 / 2 / 0
Регистрация: 31.03.2022
Сообщений: 50

Заполнить вектор экземплярами класса, используя шаблонную дружественную функцию

20.11.2022, 17:21. Показов 930. Ответов 15
Метки с++ (Все метки)

Студворк — интернет-сервис помощи студентам
Есть классы деталь и сборка. Конструкторы находятся в зоне protected. В main() следует создать несколько экземпляров указанных типов, помещая их в хранилище (vector), используя шаблонную дружественную функцию. Возникла проблема сделать шаблонную функцию дружественной классам. Заранее спасибо
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
#include <iostream>
#include <vector>
 
using namespace std;
 
class Detail {
protected:
    string detail;
    Detail() {};
    virtual ~Detail() {}
    friend int main();
    friend T1 FillVector(std::vector <T1> b)
    
};
 
class Assembling :public Detail {
protected:
    Assembling() {
        detail = "Detail is assembling"; }
     ~Assembling() override {}
    friend int main();
    friend T1 FillVector(std::vector <T1> b)
};
 
template <typename T1>
T1 FillVector(std::vector <T1> b) {
    Assembling a;
    for (int i = 0; i < 5; ++i)
    {
        vec.push_back(a.detail);    
    }
}
 
vector <string> vec;
 
int main() {
    for (vector<string>::iterator i = vec.begin(); i != vec.end(); i++)
    {
        cout << *i << endl;
    }
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.11.2022, 17:21
Ответы с готовыми решениями:

Копилятор не находит дружественную шаблонную функцию
При запуске программа выдает такую ошибку, что делать? Ошибка LNK2019 ссылка на неразрешенный внешний символ &quot;class...

Создать два класса: вектор и матрица; определить функцию умножения матрицы на вектор, как дружественную
Cоздать два класса: вектор и матрица. Определить конструкторы(по умолчанию, с параметрами, копирования), деструкторы. Определить функцию...

Написать шаблонную функцию от 2ух параметров (вектор и список). Функция должна построить и вернуть новый вектор, по
Написать шаблонную функцию от 2ух параметров (вектор и список). Функция должна построить и вернуть новый вектор, полученный из исходного...

15
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
20.11.2022, 17:43
Лучший ответ Сообщение было отмечено BydloProgramm как решение

Решение

Цитата Сообщение от BydloProgramm Посмотреть сообщение
C++
1
friend T1 FillVector(std::vector <T1> b)
C++
1
2
template <typename T1>
friend T1 FillVector(std::vector<T1> b);
1
18 / 2 / 0
Регистрация: 31.03.2022
Сообщений: 50
20.11.2022, 20:38  [ТС]
DrOffset, возникают ошибки на 28 и 32 строках:Assembling::Assembling: невозможно обратиться к protected член, объявленному в классе "Assembling"
Detail::detail: невозможно обратиться к protected член, объявленному в классе "Detail" функция дружественная
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
#include <iostream>
#include <vector>
 
using namespace std;
 
class Detail {
protected:
    string detail;
    Detail() {};
    virtual ~Detail() {}
    friend int main();
    template <typename T1>
    friend T1 FillVector(std::vector<T1> b);
    
};
 
class Assembling :public Detail {
protected:
    Assembling() {
        detail = "Detail is assembling"; }
     ~Assembling() override {}
    friend int main();
    template <typename T1>
    friend T1 FillVector(std::vector<T1> b);
};
 
template <typename T1>
T1 FillVector(std::vector <T1> *vec) {
    Assembling a;
    for (int i = 0; i < 5; ++i)
    {
        vec.push_back(a.detail);
    }
}
 
vector <string> vec;
 
int main() {
    FillVector(&vec);
    for (vector<string>::iterator i = vec.begin(); i != vec.end(); i++)
    {
        cout << *i << endl;
    }
    return 0;
}
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
20.11.2022, 20:49
Цитата Сообщение от BydloProgramm Посмотреть сообщение
DrOffset, возникают ошибки
А чего у вас тип параметра-то у шаблона функции отличается?

Добавлено через 34 секунды
...
Цитата Сообщение от BydloProgramm Посмотреть сообщение
std::vector<T1>
Цитата Сообщение от BydloProgramm Посмотреть сообщение
std::vector <T1> *
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
20.11.2022, 20:58
BydloProgramm, ты знаешь что friend это хак для инкапсуляции и сокрытия данных.

Добавлено через 5 минут
то есть если ты архитектуру с нуля разрабатываешь, то использование friend говорит о несовершенстве архитектуры. по мере разрастания проекта friend классы и функции очень сильно мешают и путают логическую структуру проекта. friend нужно использовать очень аккуратно.
1
18 / 2 / 0
Регистрация: 31.03.2022
Сообщений: 50
20.11.2022, 21:07  [ТС]
DrOffset, извините, невнимательность. Но теперь другая ошибка на 32 строке: выражение слева от ".push_back" должно представлять класс, структуру или объединение. Я неправильно передаю в функцию указатель на вектор?
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
#include <iostream>
#include <vector>
 
using namespace std;
 
class Detail {
protected:
    string detail;
    Detail() {};
    virtual ~Detail() {}
    friend int main();
    template <typename T1>
    friend T1 FillVector(std::vector<T1> *vec);
    
};
 
class Assembling :public Detail {
protected:
    Assembling() {
        detail = "Detail is assembling"; }
     ~Assembling() override {}
    friend int main();
    template <typename T1>
    friend T1 FillVector(std::vector<T1> *vec);
};
 
template <typename T1>
T1 FillVector(std::vector <T1> *vec) {
    Assembling a;
    for (int i = 0; i < 5; ++i)
    {
        vec.push_back(a.detail);
    }
}
 
vector <string> vec;
 
int main() {
    FillVector(&vec);
    for (vector<string>::iterator i = vec.begin(); i != vec.end(); i++)
    {
        cout << *i << endl;
    }
    return 0;
}
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
20.11.2022, 21:20
Цитата Сообщение от BydloProgramm Посмотреть сообщение
выражение слева от ".push_back" должно представлять класс, структуру или объединение. Я неправильно передаю в функцию указатель на вектор?
Если передаете указатель, то вместо точки используется ->

C++
1
vec->push_back(a.detail);
Добавлено через 1 минуту
Цитата Сообщение от _stanislav Посмотреть сообщение
если ты архитектуру с нуля разрабатываешь, то использование friend говорит о несовершенстве архитектуры
Где ты это прочитал, расскажи пожалуйста? Интересует именно процитированное.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
20.11.2022, 21:31
Цитата Сообщение от DrOffset Посмотреть сообщение
Где ты это прочитал, расскажи пожалуйста?
сам придумал, и сталкивался c тем что "все" классы связанны со "всеми" классами с помощью friend, отслеживать зависимости в таком случае мучение.
Цитата Сообщение от DrOffset Посмотреть сообщение
Интересует именно процитированное.
о несовершенстве архитектуры говорил в данной манере Страуструп (TCPL), только он говорил о привидении типов, а я экстраполировал на данную тему. я еще Маерса вспомнил, как он говорил что от друзей больше проблем чем благ.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
20.11.2022, 21:41
_stanislav, Использование инструмента friend в проекте
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
20.11.2022, 21:50
Цитата Сообщение от DrOffset Посмотреть сообщение
Использование инструмента friend в проекте
ты же мне это не в упрек написал, а для дополнения?

поправка:
если ты архитектуру с нуля разрабатываешь, то бездумное использование friend говорит о несовершенстве архитектуры
и еще:
Цитата Сообщение от _stanislav Посмотреть сообщение
friend нужно использовать очень аккуратно.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
20.11.2022, 21:54
Цитата Сообщение от _stanislav Посмотреть сообщение
ты же мне это не в упрек написал, а для дополнения?
Изначально мне просто хотелось посмотреть на источник этого мнения о том, что "friend - это хак инкапсуляции". Т.к. достаточно часто это звучит.
0
18 / 2 / 0
Регистрация: 31.03.2022
Сообщений: 50
20.11.2022, 21:54  [ТС]
DrOffset, Спасибо) теперь ошибка "FillVector<std::basic_string<char,std:: char_traits<char>,std::allocator<char>>> : должна возвращать значение" Но мне не нужно возвращать что то, мне нужно заполнить вектор, можно как то это исправить?
C++
1
2
3
4
5
6
7
8
template <typename T1>
T1 FillVector(std::vector <T1> *vec) {
    Assembling a;
    for (int i = 0; i < 5; ++i)
    {
        vec->push_back(a.detail);
    }
}
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
20.11.2022, 21:55
Цитата Сообщение от BydloProgramm Посмотреть сообщение
Но мне не нужно возвращать что то, мне нужно заполнить вектор, можно как то это исправить?
Зачем вы тогда написали T1 в типе возвращаемого значения, если не собираетесь ничего возвращать?
Если не собираетесь возвращать, то напишите там void.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
20.11.2022, 21:56
Цитата Сообщение от DrOffset Посмотреть сообщение
Изначально мне просто хотелось посмотреть на источник этого мнения о том, что "friend -это хак инкапсуляции". Т.к. достаточно часто это звучит.
самое первое что может предти человеку на ум именно хакнуть инкапсуляцию. в нашем проекте сплошь и рядом. кстати ПС тоже не исключение
Цитата Сообщение от BydloProgramm Посмотреть сообщение
friend int main();
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
20.11.2022, 21:57
Цитата Сообщение от _stanislav Посмотреть сообщение
самое первое что может предти человеку на ум именно хакнуть инкапсуляцию. в нашем проекте сплошь и рядом. кстати ПС тоже не исключение
Это от изъянов в обучении происходит.
0
18 / 2 / 0
Регистрация: 31.03.2022
Сообщений: 50
20.11.2022, 22:18  [ТС]
DrOffset, спасибо за Ваши ответы, выручили)

Добавлено через 1 минуту
_stanislav, дядь, я на втором курсе, какие хакеры
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.11.2022, 22:18
Помогаю со студенческими работами здесь

Написать шаблонную функцию от 2ух параметров (вектор и список). Функция должна построить и вернуть новый вектор, по
Написать шаблонную функцию от 2ух параметров (вектор и список). Функция должна построить и вернуть новый вектор, полученный из исходного...

Написать шаблонную функцию от 2ух параметров (вектор и список). Функция должна построить и вернуть новый вектор, по
Написать шаблонную функцию от 2ух параметров (вектор и список). Функция должна построить и вернуть новый вектор, полученный из исходного...

Передать вектор объектов в дружественную функцию
Я думаю передать вот так, но почему-то синтаксическая ошибка. filtr_tup(vector&lt;OC&gt;); #ifndef OC_H #define OC_H #include...

Определить функцию умножения матрицу на вектор как дружественную
Создать два класса вектор (int *) и матрица (int **). Определить конструкторы - по умолчанию, с параметром, для класса матрица с двумя...

Определить функцию умножения матрицу на вектор как дружественную
Создать два класса вектор (double *) и матрица (double **). Определить конструкторы - по умолчанию, с параметром, для класса матрица с...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru