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

Функция, которая возвращает string

23.12.2019, 23:57. Показов 7067. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.

Есть пример самого элементарного многофайлового проекта, но он не хочет компилироваться.
Ошибка: Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int

b.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "pch.h"
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include "functions.h"
 
using namespace std;
 
int main()
{
    string str;
    cin >> str;
    cout << sum(str);
}
functions.h
C++
1
2
3
4
#pragma once
    using namespace std;
 
    string sum(string str);
functions.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "pch.h"
#include "functions.h"
#include <string>
 
using namespace std;
 
string sum(string str) {
    str = str.erase(str.length() - 1, 1);
    return str;
}
Помогите))
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.12.2019, 23:57
Ответы с готовыми решениями:

Подскажите функцию, которая возвращает длину строки (string), strlen не подходит.
Подскажите функцию, которая возвращает длину строки (string), strlen не подходит!!!!!!

Функция которая возвращает класс
Есть функция считывания вектора с формы Вызов функции выглядит так Vector1.GetVector(GridOfVector1); CVector...

Функция, которая возвращает структуру
Не поддаётся компиляции. В чём дело? Как с этим работать? Не нашёл ответа и буду благодарен, если объясните и поправите //source.h ...

16
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
24.12.2019, 02:09
Лучший ответ Сообщение было отмечено zEEmperon как решение

Решение

Цитата Сообщение от zEEmperon Посмотреть сообщение
#include "functions.h"
#include <string>
попробуй местами эти строки поменять в functions.cpp

Цитата Сообщение от zEEmperon Посмотреть сообщение
using namespace std;
а это выкинь оттуда
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
24.12.2019, 07:37
Цитата Сообщение от zEEmperon Посмотреть сообщение
#include <string>
это должно находится в
Цитата Сообщение от zEEmperon Посмотреть сообщение
functions.h
0
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
24.12.2019, 11:28
Цитата Сообщение от zayats80888 Посмотреть сообщение
это должно находится в
необязательно
как по мне, это плохая практика, все хедеры писать в h/hpp файл, если у нас там определен только прототип
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
24.12.2019, 11:53
Цитата Сообщение от Pashka Durov Посмотреть сообщение
как по мне, это плохая практика, все хедеры писать в h/hpp файл
Хэдеры для того и существуют, что бы в них записывать заголовки.
Не?

Считаете хорошей практикой вписывать #include <string> в каждый cpp файл,
который подключается к себе #include "functions.h" ?

Проще же просто подключать #include "functions.h", а он всё нужное ему для работы подтащит к себе сам.

Цитата Сообщение от Pashka Durov Посмотреть сообщение
определен только прототип
"Прототип" - это термин языка си. И это вовсе не синоним "объявления функции".
На языке с++ лучше не использовать, что бы ненароком не вызвать когнитивный диссонанс у некоторых личностей.
0
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
24.12.2019, 12:07
Цитата Сообщение от eva2326 Посмотреть сообщение
Считаете хорошей практикой вписывать #include <string> в каждый cpp файл,
который подключается к себе #include "functions.h" ?
Проще же просто подключать #include "functions.h", а он всё нужное ему для работы подтащит к себе сам.
Да, считаю
Вот пример
a.hpp
C++
1
int num(std::string);
a.cpp
C++
1
2
3
4
5
6
#include <string>
#include "a.hpp"
int num (std::string str)
{
    return std::stoi(str);
}
b.cpp
C++
1
2
3
4
5
6
7
#include <iostream>
#include "a.hpp"
int main()
{
    std::cout<<num("256");
    return 0;
}
Видно, что в b.cpp заголовок <string> не нужен, но если бы мы прописали его в a.hpp, то он и в b.cpp оказался тоже

Цитата Сообщение от eva2326 Посмотреть сообщение
"Прототип" - это термин языка си. И это вовсе не синоним "объявления функции".
Прототипом функции в языке Си или C++ называется объявление функции, не содержащее тела функции
https://ru.wikipedia.org/wiki/... 0%B8%D0%B8
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
24.12.2019, 12:17
Цитата Сообщение от Pashka Durov Посмотреть сообщение
C++
1
2
3
4
5
6
7
#include <iostream>
#include "a.hpp"
int main()
{
    std::cout<<num("256");
    return 0;
}
только прикол в том что это работает только потому что <iostream> где то в глубине инклюдит <string>

Добавлено через 1 минуту
C++
1
2
3
4
5
6
#include "a.hpp"
int main()
{
    num("256");
    return 0;
}
попробуй так
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
24.12.2019, 12:17
Pashka Durov,
Цитата Сообщение от Pashka Durov Посмотреть сообщение
Видно, что в b.cpp заголовок <string> не нужен, но если бы мы прописали его в a.hpp, то он и в b.cpp оказался тоже
а если string нужен в тысячах других срр файлов которые инклудят этот хедер? Вы будете его тысячи раз вписывать?
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
24.12.2019, 12:19
Цитата Сообщение от ReYalp Посмотреть сообщение
а если string нужен в тысячах других срр файлов которые инклудят этот хедер? Вы будете его тысячи раз вписывать?
Вот на счет этого можно поспорить, лучше вписать его там где он нужен хоть и в тысяче мест, особенно если этот хедер может измениться. Лишние зависимости не нужны, так как огромные С++ проекты могут собираться очень долго
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
24.12.2019, 12:33
Цитата Сообщение от Pashka Durov Посмотреть сообщение
Видно, что в b.cpp заголовок <string> не нужен
Нужен)))

Единственная причина, почему у вас вообще может скомпилировать, это потому что заголовок #include <iostream> подтягивает <string> (или его forward declaration)

Однако, <iostream> не обязан этого делать.



Цитата Сообщение от Pashka Durov Посмотреть сообщение
Прототипом функции в языке Си или C++ называется объявление функции, не содержащее тела функции
В языке си прототип - это предварительное объявление функции без указания формальных параметров.


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int sum();  // прототип
 
int main (void)
{
   int total;       
   total = sum (2, 3);
   printf ("Total is %d\n", total);        
   return 0;
}
 
int sum (int a, int b)
{
   return a + b;
}
В языке с++ термина "прототип" не существует.

Цитата Сообщение от Raali Посмотреть сообщение
лучше вписать его там где он нужен хоть и в тысяче мест
Кто определяет, что именно нужно компоненту component.hpp, сам компонент? Или main.cpp, и другие использующие компонент файлы?

Если компонент component.hpp изменится, где нужно вписывать изменения? в одном лишь файле component.hpp или во всех 10005000 cpp файлах, которые имели несчастье с ним связаться?

Вынуждать клиентов вручную самим следить за зависимостями - это какой то бред.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
24.12.2019, 12:40
Цитата Сообщение от Pashka Durov Посмотреть сообщение
как по мне, это плохая практика, все хедеры писать в h/hpp файл, если у нас там определен только прототип
это плохая практика, если там используются только ссылки и указатели на тип из другого заголовка, тогда да, глупо тащить лишний заголовок (можно обойтись предварительным объявлением). Но в данном случае это не прокатит. Подробно работа препроцессора описана в этом блоге, почитайте https://www.cyberforum.ru/blogs/18334/blog100.html
0
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
24.12.2019, 12:49
Цитата Сообщение от eva2326 Посмотреть сообщение
В языке с++ термина "прототип" не существует.
Существует, во всех книгах, во всех статьях используют слово "прототип"

Такого же мнения
Цитата Сообщение от Raali Посмотреть сообщение
Вот на счет этого можно поспорить, лучше вписать его там где он нужен хоть и в тысяче мест, особенно если этот хедер может измениться. Лишние зависимости не нужны, так как огромные С++ проекты могут собираться очень долго
Ну тут я не знал, что iostream тянет кучу зависимостей, виноват

Цитата Сообщение от eva2326 Посмотреть сообщение
Единственная причина, почему у вас вообще может скомпилировать, это потому что заголовок #include <iostream> подтягивает <string> (или его forward declaration)
Однако, <iostream> не обязан этого делать.
Цитата Сообщение от Raali Посмотреть сообщение
только прикол в том что это работает только потому что <iostream> где то в глубине инклюдит <string>
Цитата Сообщение от eva2326 Посмотреть сообщение
Вынуждать клиентов вручную самим следить за зависимостями - это какой то бред.
Чуть переделаю код:
a.hpp
C++
1
int num(int);
a.cpp
C++
1
2
3
4
5
6
7
8
9
#include <string>
#include <algorithm>
#include "a.hpp"
int num (int i)
{
    std::string str = std::to_string(i);
    std::reverse(str.begin(), str.end());
    return std::stoi(str);
}
b.cpp
C++
1
2
3
4
5
6
#include "a.hpp"
int main()
{
    int i = num(256);
    return 0;
}
Теперь точно видно, что b.cpp не нуждается в string и algorithm
Миниатюры
Функция, которая возвращает string  
0
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
24.12.2019, 12:52
Цитата Сообщение от zayats80888 Посмотреть сообщение
Подробно работа препроцессора описана в этом блоге, почитайте https://www.cyberforum.ru/blogs/18334/blog100.html
Я знаю, как он работает, он просто пушит содержимое файла, туда, куда мы подставим его (если говорить об #include)
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
24.12.2019, 13:36
Цитата Сообщение от Pashka Durov Посмотреть сообщение
Существует, во всех книгах, во всех статьях используют слово "прототип"
Ну не во всех)
Не путайте разговорную речь с официальной терминологией.
В серьёзных источниках если и используют, то в правильном значении.
Например, в стандарте с++ все упоминания "prototype" - это либо отсылки к языку си, либо отсылка к Function prototype scope

Цитата Сообщение от Pashka Durov Посмотреть сообщение
Чуть переделаю код
Цитата Сообщение от Pashka Durov Посмотреть сообщение
int num(int);
Цитата Сообщение от Pashka Durov Посмотреть сообщение
Теперь точно видно, что b.cpp не нуждается в string и algorithm
В таком варианте string и algorithm - это уже детали реализации.
Они никому не нужны кроме a.cpp

Кстати, в a.cpp присутствует лишний инклюд.

C++
1
2
3
4
5
6
7
8
9
#include <string>
#include <algorithm>
// #include "a.hpp"   этот инклюд был лишним
int num (int i)
{
    std::string str = std::to_string(i);
    std::reverse(str.begin(), str.end());
    return std::stoi(str);
}
0
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
24.12.2019, 13:43
Цитата Сообщение от eva2326 Посмотреть сообщение
Кстати, в a.cpp присутствует лишний инклюд.
ну не такой уж он и лишний, он показывает, что это не просто какая-то функция num, а именно из a.hpp, но не спорю, что его можно выкинуть. Он нужен просто для наглядности
Цитата Сообщение от eva2326 Посмотреть сообщение
В таком варианте string и algorithm - это уже детали реализации.
Они никому не нужны кроме a.cpp
Долго можно спорить, но все же я предпочитаю в хедер помещать только объявления (так уж и быть, пусть будут они, а не прототипы, если вам так удобней), а если говорить про
Цитата Сообщение от eva2326 Посмотреть сообщение
во всех 10005000 cpp файлах
Можно сделать что-то такое
dependecies.hpp
C++
1
2
3
#include <...>
...
#include "..."
И подключать его там, где нужно
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
24.12.2019, 14:56
Цитата Сообщение от Pashka Durov Посмотреть сообщение
Можно сделать что-то такое
dependecies.hpp
А потом, по мере роста проекта нашлепать dependecies1.hpp, dependecies2.hpp ?)
И вручную следить, что бы они не пересекались?

С таким подходом просто неизбежно возникнет бардак))

Непонятно, зачем такие сложности, если можно просто сразу подключать #include "functions.h", и не заморачиваться.

Вы не задумывались, почему <iostream> подтянул <string> ?
Потому что string - деталь его реализации, без которой он бы просто не смог скомпилироваться.
И таких запчастей там вагон и тележка.

А сколько запчастей у самого <string> ?

Представьте себе, что если бы разработчики стандартной библиотеки думали как вы, тогда пользователям пришлось бы самим вручную подтаскивать 100500 различных заголовков. Ну или 100500 различных dependecies.hpp
Это было бы настолько неудобно, что просто невозможно было бы пользоваться.
0
143 / 92 / 34
Регистрация: 30.01.2018
Сообщений: 469
24.12.2019, 15:31
eva2326, предлагаю сойтись на мнении, что какие-то общие библиотеки надо прописывать в hpp, а детали реализации только в cpp
То есть так:

a.hpp
C++
1
2
#include <string>
int num(std::string);
a.cpp

C++
1
2
3
4
5
6
7
#include <algorithm> //никак не повлияет на работоспособность main
#include "a.hpp"  
int num (std::string str)
{
    std::reverse(str.begin(), str.end());
    return std::stoi(str);
}
b.cpp
C++
1
2
3
4
5
6
#include "a.hpp"
int main()
{
    int i = num("256");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.12.2019, 15:31
Помогаю со студенческими работами здесь

Функция, которая возвращает массив
Как сделать так чтобы функция возвращала указатель на рандомно сгенерированный массив. Входящими данными будет количество строк и столбцов...

Функция, которая возвращает массив
Здравствуйте. Подскажите, пожалуйста, как правильно написать код - есть функция; она должна вернуть массив, который создается в этой же...

Функция, которая только возвращает значение
Как реализовать функцию, которая только возвращает значение. Вот, например: #include &quot;stdafx.h&quot; #include &lt;locale&gt; ...

Функция которая возвращает динамический массив
Здравствуйте! у меня такой глупый вопрос. Я все время путаюсь и никак не могу четко сформулировать на него ответ. Помогите мне раз и...

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru