С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
#1

Файл заголовок - C++

02.07.2012, 00:53. Просмотров 420. Ответов 9
Метки нет (Все метки)

Приветствую, подскажите что не так.
Надо чтобы в файле Sa.h были объявления функций
в файле Sa.cpp были определения функций
в файле исходного кода first_program.cpp был вызов этих функций

файл Sa.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef SA_H
#define SA_H
 
#include <string>
 
std::string f();
std::string f(std::string&);
std::string f(int&);
std::string f(double&);
std::string f(char&);
 
#endif
файл Sa.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "Sa.h"
 
inline std::string f() {
    return "pusto";
}
 
inline std::string f(const std::string &s) {
    return "string";
}
 
inline std::string f(int &t) {
    return "integer";
}
 
inline std::string f(double &d) {
    return "double";
}
 
inline std::string f(char &a) {
    return "char";
}
файл исходного кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <string>
#include <iostream>
#include "Sa.h"
 
int main() 
{
    std::cout << f(43) << std::endl;
    std::cout << f(26.2) << std::endl;
    std::cout << f() << std::endl;
    std::cout << f('a') << std::endl;
    std::cout << f("stroka") << std::endl;
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2012, 00:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Файл заголовок (C++):

Немогу подключить файл-заголовок. - C++
Доброго времени. Вопрос бональный, ну немогу найти решения. Есть два файла: 1)F_cat.cpp #include &lt;HCat.hpp&gt; Cat::Cat(int...

Сформировать заголовок, отправить его, а затем принять ответный заголовок - C++
День добрый, форумчане. Предо мной задача - сформировать заголовок, отправить его, а затем принять ответный заголовок. Первая часть...

Заголовок - C++
Как вывести заголовок перед таблицей в си++?

PE заголовок - C++
как вычислить начало первой секции?

Отсутствует заголовок функции - C++
Подскажите в чём дело #include &lt;windows.h&gt; int WINAPI WinMain(HINSTANCE hLnstance, HINSTANCE hPrevInstance, LPSTR ipCmdLine,...

Заголовок функции содержит - C++
Заголовок функции содержит?

9
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
02.07.2012, 00:56 #2
И что же не так? Что не работает?
0
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
02.07.2012, 00:57  [ТС] #3
вот ошибка, и так для каждого вызова функции
1>------ Построение начато: проект: first_program, Конфигурация: Debug Win32 ------
1>Компиляция...
1>first_program.cpp
1>d:\developer\проекты c++\first_program\first_program\first_program.cpp(7) : error C2665: f: ни одна из 5 перегрузок не может преобразовать все типы аргументов
1> d:\developer\проекты c++\first_program\first_program\sa.h(7): может быть 'std::string f(std::string &)'
1> d:\developer\проекты c++\first_program\first_program\sa.h(8): или 'std::string f(int &)'
1> d:\developer\проекты c++\first_program\first_program\sa.h(9): или 'std::string f(double &)'
1> d:\developer\проекты c++\first_program\first_program\sa.h(10): или 'std::string f(char &)'
1> при попытке сопоставить список аргументов '(int)'
если все в 1 файле исходного кода все работает, но я хочу понять как это распределить по нескольким файлам
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
02.07.2012, 01:06 #4
Вы передаете в функцию константы по ссылке, или добавляйте везде спецификатор const в параметрах функции, или объявляйте в main неконстантные переменные и передавайте уже их в функцию.
0
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
02.07.2012, 01:23  [ТС] #5
но вот так все работает
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
#include <string>
#include <iostream>
 
std::string f();
std::string f(std::string);
std::string f(int);
std::string f(double);
std::string f(char);
 
inline std::string f() {
    return "pusto";
}
 
inline std::string f(std::string s) {
    return "string";
}
 
inline std::string f(int t) {
    return "integer";
}
 
inline std::string f(double d) {
    return "double";
}
 
inline std::string f(char a) {
    return "char";
}
 
int main() 
{   
    std::cout << f(43) << std::endl;
    std::cout << f(25.7) << std::endl;
    std::cout << f() << std::endl;
    std::cout << f('a') << std::endl;
    std::cout << f("reta") << std::endl;
    return 0;
}
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
02.07.2012, 01:34 #6
Потому что так Вы передаете по значению. То есть при входе в функцию будут созданы переменные, которым будет присвоены значения констант. Когда Вы передаете по ссылке естественно передается адрес переменной, которую можно изменить.
Вот смотрите, допустим, Вы написали так:
C++
1
std::cout << f(43) << std::endl;
А функция f имеет прототип f( int & );

Тогда при вызове функции должен передаться адрес параметра, в данном случае это константа 26. То есть будет доступна запись вида
C++
1
2
3
4
5
std::string f( int &a ) {
   a = 100;
   
   return "integer";
}
Что абсолютно бессмысленно.

В то же время, если прототип имеет вид f( int );

То при вызове функции, создастся переменная, которой будет присвоено значение константы, и которую мы уже можем менять внутри функции, и которая соответственно уничтожится при выходе из функции.
0
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
02.07.2012, 01:43  [ТС] #7
это я понял, но пробовал и без ссылки передавать все равно ошибки.
В итоге решил убрать inline и все заработало , теперь не могу понять как это мешало
правда немного изменил функции теперь они выводят результат, а не возвращают строку

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <string>
#include <iostream>
#include "Sa.h"
 
void f() {
    std::cout<< "pusto" << std::endl;
}
 
void f(std::string s) {
    std::cout<< "string" << std::endl;
}
 
void f(int t) {
    std::cout<< "integer" << std::endl;
}
 
void f(double d) {
    std::cout<< "double" << std::endl;
}
 
void f(char a) {
    std::cout<< "char" << std::endl;
}
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
02.07.2012, 01:54 #8
Цитата Сообщение от DaskOFF Посмотреть сообщение
но пробовал и без ссылки передавать все равно ошибки.
Вы только что писали выше ( в посте #5 ), что передавая по значению у Вас все работало, а теперь говорите, что были ошибки.
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.07.2012, 06:44 #9
Цитата Сообщение от DaskOFF Посмотреть сообщение
это я понял, но пробовал и без ссылки передавать все равно ошибки.
В итоге решил убрать inline и все заработало , теперь не могу понять как это мешало
правда немного изменил функции теперь они выводят результат, а не возвращают строку
С inline не работает код без ссылок, но уже по другой причине. А с сылками, что с inline, что без inline - не работает. С inline без ссылок линковщик ошибки выдаёт:
1>------ Построение начато: проект: LAB, Конфигурация: Debug Win32 ------
1>lab04.obj : error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl f(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?f@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@Z) в функции _main
1>lab04.obj : error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl f(char)" (?f@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@D@Z) в функции _main
1>lab04.obj : error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl f(void)" (?f@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) в функции _main
1>lab04.obj : error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl f(double)" (?f@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@N@Z) в функции _main
1>lab04.obj : error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl f(int)" (?f@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) в функции _main
1>D:\MY C++Projects\LAB\Debug\LAB.exe : fatal error LNK1120: 5 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Добавлено через 21 минуту
Не знаю в чём тут дело, но с inline получается так: или поместить реализации функций в заголовочный файл (вместе с прототипами), или подключить файл с реализацииями в файле с main() (#include "Sa.cpp"), или, что, наверное, наиболее правильно, в файле реализации писать так:
C++
1
2
3
extern inline std::string f() {
    return "pusto";
}
Добавлено через 14 минут
Значит, если inline, то нужно реализацию и прототип в одном файле держать, или в реализации указать (через extern), что объявление функции находится в другом файле.
1
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
02.07.2012, 07:07  [ТС] #10
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вы только что писали выше ( в посте #5 ), что передавая по значению у Вас все работало, а теперь говорите, что были ошибки.
да, работало, когда в одном файле, а если разбить то уже нет, но все равно спасибо
0
02.07.2012, 07:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2012, 07:07
Привет! Вот еще темы с ответами:

Как получит заголовок окна? - C++
Хотел спросить: вот висит окно, как получить его заголовок, если допустим я знаю указатель на это окно? И еще, допустим, открыта...

Заголовок CMDIFrameWnd - как избавится? - C++
рнее окно разворачивается, то его название в заголовке родительского окна отображается в скобках (например, AppName - ). Как избавится от...

Как изменить заголовок консольного окна - C++
По умолчанию в заголовке консольного окна пишется путь до .exe который вызвал это консольное окно А можно как то его изменить ? ...

Добавить заголовок для произвольного файла - C++
Добрый день! Помогите пожалуйста разобраться, почему не работает программа. Для произвольного файла, используя класс fstream, нужно...


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

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

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