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

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

20.11.2022, 17:21. Показов 991. Ответов 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru