Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/89: Рейтинг темы: голосов - 89, средняя оценка - 4.79
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518

Зачем нужен h-файл? Почему нельзя все хранить в cpp?

05.08.2014, 14:11. Показов 18959. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите новичку! С с++ работаю впервые. Перешел с явы, делфи, рнр. Не понимаю что такое h-файл и чем он отличается от cpp и почему нельзя все хранить в одном файле... Нужно "сломать сознание" под логику другого языка...

Обьясните пожалуста:
Есть main.cpp, в котором определил класс:

C++
1
2
3
4
5
6
7
8
class wStr3 {
private:
public:
    string As_string(); 
};
string wStr3::As_string() {
    return "asdf";
}
Все работает...
C++
1
2
    wStr3 s1;
    cout << "wStr3 = " << s1.As_string() << endl;
Теперь хочу этот класс вынести во внешний файл и подключать его в main.cpp. Как это сделать?

Что должно быть в myclass.h, что в myclass.cpp? Как его подключить в main.cpp? Кроме названия файла myclass.h и myclass.cpp чем-то связаны?

... вроде делал по инструкциям, вынес описание класса в h, а string wStr3::As_string() { в cpp, но компилятор выдал:
undefined reference to `wStr::As_string()'
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.08.2014, 14:11
Ответы с готовыми решениями:

Почему в коллекциях типа Set нельзя хранить null
Почему в коллекциях типа Set нельзя хранить значение null

Зачем вообще нужен рабочий стол, если в нем нельзя создавать даже папки и ярлыки
Накрылся диск. Пришлось заново устанавливать ubuntu. Оказалось, что помещать или создавать папки и ярлыки на рабочем столе unity нельзя....

Почему нельзя импортировать сразу все?
К примеру вот так: from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtMultimedia...

12
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
05.08.2014, 14:14
Цитата Сообщение от Tester64 Посмотреть сообщение
Что должно быть в myclass.h
Объявление.
Цитата Сообщение от Tester64 Посмотреть сообщение
что в myclass.cpp
Определение.
Цитата Сообщение от Tester64 Посмотреть сообщение
Как его подключить в main.cpp?
#include "что-то_там.h"
Цитата Сообщение от Tester64 Посмотреть сообщение
Кроме названия файла myclass.h и myclass.cpp чем-то связаны?
Последний будет инклудить первый, чтобы видеть объявление.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
05.08.2014, 14:15
C++
1
2
3
// h-файл (скажем, MyCoolString.h)
#pragma once
class wStr3 { private: public:     string As_string();  };
C++
1
2
3
4
 // cpp-файл
#include "MyCoolString.h"
 
 string wStr3::As_string() {     return "asdf"; }
1
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
05.08.2014, 14:15
Цитата Сообщение от Tester64 Посмотреть сообщение
... вроде делал по инструкциям, вынес описание класса в h, а string wStr3::As_string() { в cpp, но компилятор выдал:
undefined reference to `wStr::As_string()'
Не знаю, по какой инструкции ты делал. Сначала компилируешь свой myclass.cpp в объектный модуль. Потом компилируешь main.cpp и компонуешь с объектником от предыдущей операции. Все. Можно использовать любой тул для автоматизации этого процесса.
1
34 / 34 / 8
Регистрация: 13.06.2014
Сообщений: 509
05.08.2014, 14:21
Tester64, ты в принципе можешь все в цпп файле писать, не знаю на счет скорости, но явно лучше, когда у тебя все структурировано, ибо когда ты пишешь большую нормальную прогу, что-то найти в коде тебе будет сложнее, это патерн какой-то не помню какой
1
 Аватар для dimabubyakin
161 / 122 / 85
Регистрация: 16.10.2013
Сообщений: 1,738
05.08.2014, 14:37
Tester64, *.h - это заголовочный файл, обычно в них хранятся классы, методы и так далее, без реализации, а реализация происходит в *.cpp файлах, вот к примеру есть класс MyClass
MyClass.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef __MYCLASS_H__
#define __MYCLASS_H__
#include <iostream>
using namespace std;
 
class MyClass
{
public:
    void Print();
};
#endif
MyClass.cpp
C++
1
2
3
4
5
#include "MyClass.h"
void MyClass::Print()
{
    cout<<"Hello World"<<endl;
}
main
C++
1
2
3
4
5
6
7
8
9
#include "MyClass.h"
int main()
{
    MyClass *mc = new MyClass();
    mc->Print();
    system("pause");
    delete mc;
    return 0;
}
0
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
05.08.2014, 15:15  [ТС]
Цитата Сообщение от Vourhey Посмотреть сообщение
Сначала компилируешь свой myclass.cpp в объектный модуль
В этом и была основная ошибка... разложил папки по местам и сработало.
Теперь другая проблема... что такое string(без приписок)? какой include за это отвечает? и где его прописывать и сколько раз? И в H и в CPP и в main? Сработало лишь когда "упростил" задачу - заменил строку на int. Раньше в main работало, но там слишком много инклюдов...
Пишет:

...wstr.h:13:2: error: 'string' does not name a type
string As_string(); //
^
...wstr.cpp:10:1: error: 'string' does not name a type
string wStr::As_string() {
^

Цитата Сообщение от frostyfull Посмотреть сообщение
принципе можешь все в цпп файле писать
А как тогда инклюдить чужой класс в свою программу? Я думал инклюдятся лишь h-файлы...

Добавлено через 2 минуты
... блин, этот с++ это сплошные тонкости... хуже китайского!
чем отличается
mc->Print();
от
mc.Print();
у меня вроде и точка сработала. Но поставил ее по привычке после явы...
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
05.08.2014, 15:19
Цитата Сообщение от Vourhey Посмотреть сообщение
Объявление.
кстати в .h-никах может быть и определение... компилятор это проглотит но вообще лично мне не нравится вся эта история с заголовочными файлами, в том же делфи удобно то что там все в .pas файлах
0
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
05.08.2014, 15:30  [ТС]
Цитата Сообщение от GetHelp Посмотреть сообщение
в том же делфи удобно то что там все в .pas файлах
В яве тоже все в одном файле... но как там... с волками жить... или про монастырь со своим уставом... Не хочу изобретать свой язык ради небольших утилит на С++
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
05.08.2014, 15:32
Цитата Сообщение от GetHelp Посмотреть сообщение
кстати в .h-никах может быть и определение... компилятор это проглотит
Да ты что? Правда? Ух ты... "А мужики-то не знают!". Напиши об этом книгу.
А теперь подключи этот .h с определением в паре .cpp файлов и собери свою программу - фейл.
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
05.08.2014, 15:40
Tester64, ну и не изобретайте.
Аналогия для понимания:
.h-файл это содержание книжки. Пара листов, где описаны какие главы есть вообще и на каких они страницах. Если вы хотите почитать что именно в этих главах, то открывайте .cpp-файл и ищите. Если вы хотите рассказать другому человеку о чем эта книжка, то вы можете просто показать ему содержание, а не полностью пересказывать всю книгу.
0
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
05.08.2014, 15:48  [ТС]
ПОЛУЧИЛОСЬ!
надо было перед заменить строки на std::string
странно что в main это не обязательно...

Добавлено через 5 минут
Цитата Сообщение от SatanaXIII Посмотреть сообщение
.h-файл это содержание книжки.
Я так примерно себе и представлял... но не до конца понял еще про инклюды! допустим в описании я хочу возвращать из функции или передавать в нее некий свой класс, определенный в другом h-файле...
Где его мне надо инклюдить? только в заголовке (ведь все равно заголовок инклюдится в "тело" с реализацией методов) или и в cpp-файле тоже? ... пока до литературы рано (это на долго) - должен получить хоть что-нибудь что-бы остаться в языке... все "методом тыка"... пока воткнул везде, где поместилось - лишь бы заработало, но логики не понимаю...
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
05.08.2014, 16:06
Tester64, Правильное подключение заголовочных файлов

Цитата Сообщение от Tester64 Посмотреть сообщение
должен получить хоть что-нибудь
Никуда не лезьте. Описывайте интерфейс класса в .h, а реализацию в .cpp и тут же подключайте соответствующий заголовочник.
Чтобы использовать несколько классов в одном подключайте заголовочники обоих в используемом. Где хотите, лишь бы работало.

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

Почему нельзя есть все подряд?
Всем привет. Физики говорят, что все тела состоят из молекул и атомов, а последние из всяких там элементарных частичек. Получается тогда,...

Зачем нужен двоичный файл?
Здраствуйте! У меня возникла такая проблема: имеется текстовая строка, нужно разбить её на отдельные слова, затем отсортировать их по...

Зачем нужен .def - файл?
Не так давно, где-то лет 5 назад, когда я учился писать первые программы на С++, я установил Borland C++ 5.0 (поскольку МАДИшный Borland C...

Зачем нужен файл Project1PCH1.h
Приветствую. В общем, вопрос в заголовке. Этот файл включен в проект при его создании в C++Builder 10.1. Имя по умолчанию. Я его всегда...

Зачем нужен TLH файл
и почему он требуется для подключения DLL ?


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru