Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
 Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560

Взаимное включение заголовочных файлов

25.10.2013, 10:56. Показов 4080. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно передать объект по ссылке

Вот как сейчас:
C++
1
2
3
4
5
6
7
8
9
10
//LoadImages.h
class LoadImages {
    ttfInit();
};
 
//LoadImages.cpp
void LoadImages::ttfInit() {
     Event obj;
    currentScore << obj.getCurrentCounter();
}
Вот как должно быть:
C++
1
2
3
4
5
6
7
8
9
//LoadImages.h
class LoadImages {
    ttfInit(Event*);
};
 
//LoadImages.cpp
void LoadImages::ttfInit(Event* p) {
    currentScore << p -> getCurrentCounter();
}
Во втором случае беда в том, что в LoadImages.h нужно подключить файл Event.h, чтобы сделать объявление ttfInit(Event*), но я этого не могу сделать, т.к. Event.h уже инклудит файл LoadImages.h, т.е. взаимное включение будет.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.10.2013, 10:56
Ответы с готовыми решениями:

Включение заголовочных файлов дважды
Как справится с тем, что некоторые файлы .h надо включить несколько раз, т.е. помимо main.cpp, еще и в других заголовочных файлах?...

Правильное включение заголовочных файлов
Привет, хочу задать такой вопрос. У меня есть классы в файлах Menu.h, Options.h, About.h, Game.h, Pause.h. Каждый из этих классов должен...

Про добавление заголовочных файлов в заголовочных файлах
В который раз эта вещь засовывает мозги в блендер! Я про то, что не могу однозначно запомнить (основываясь на моих знаниях о директиве...

8
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
25.10.2013, 11:00
Цитата Сообщение от dimakozyr Посмотреть сообщение
т.к. Event.h уже инклудит файл LoadImages.h, т.е. взаимное включение будет.
Не будет в каждом новом файле если ты что то используешь, то его нужно обязательно подключать.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
25.10.2013, 11:02
Цитата Сообщение от dimakozyr Посмотреть сообщение
Во втором случае беда в том, что в LoadImages.h нужно подключить файл Event.h, чтобы сделать объявление ttfInit(Event*)
этого не нужно делать, достаточно
C++
1
2
3
4
5
6
7
8
9
10
11
//LoadImages.h
class Event;
 
class LoadImages {
    ttfInit(Event*);
};
 
//LoadImages.cpp
void LoadImages::ttfInit(Event* p) {
    currentScore << p -> getCurrentCounter();
}
предварительного объявления в хедере
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
25.10.2013, 11:02
dimakozyr, почему у ttfInit нет имени типа?
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
25.10.2013, 11:03
Ты должен в файле Event.h делать защиту от повторного включения, да там у тебя по идее должны быть только объявления функций переменных, а объявлений может быть сколько угодно, главное что бы было только одно определение.
0
 Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560
25.10.2013, 11:42  [ТС]
Цитата Сообщение от Jupiter Посмотреть сообщение
этого не нужно делать, достаточно
Делаю так:
C++
1
2
3
4
5
6
static class Events* p;  // p нужно для передачи в ttfInit() в качестве аргумента
class LoadImages {
  public:   
      LoadImages() : { ttfInit(p); }
    void ttfInit(Events*);
};
И теперь программа компилируется, но не запускается

Цитата Сообщение от programina Посмотреть сообщение
почему у ttfInit нет имени типа?
Он есть, просто здесь случайно пропустил, тип void

Цитата Сообщение от ninja2 Посмотреть сообщение
Ты должен в файле Event.h делать защиту от повторного включения
Я делаю с помощью pragma once, но если сделать:
C++
1
2
3
4
5
6
7
8
9
// classA.h
#include "classB.h"
class A {
    B obj; // Error: пропущена точка с запятой
};
 
// classB.h
#include "classA.h"
class B {};
то выдает, пропущена точка с запятой, а это, как я понимаю, потому что не определен базовый класс
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
25.10.2013, 11:48
Цитата Сообщение от dimakozyr Посмотреть сообщение
Делаю так:
static class Events* p; *// p нужно для передачи в ttfInit() в качестве аргумента
class LoadImages {
* public: *
* * * LoadImages() : { ttfInit(p); }
* * void ttfInit(Events*);
};
И теперь программа компилируется, но не запускается
этот код и близко неподпадает под то что ты спрашивал в 1-м посту, короче нет времени тебе тут пересказывать книги так что давай сам иди и RTFM

C++
1
2
3
4
5
6
7
8
9
10
11
12
//LoadImages.h
class Event;
 
class LoadImages {
    ttfInit(Event*);
};
 
//LoadImages.cpp
#include "Event.h"
void LoadImages::ttfInit(Event* p) {
    currentScore << p->getCurrentCounter();
}
начали с взаимного включения хедеров, а закончили глобальными статическими переменными
0
 Аватар для dimakozyr
383 / 30 / 3
Регистрация: 17.08.2013
Сообщений: 560
25.10.2013, 11:52  [ТС]
Цитата Сообщение от Jupiter Посмотреть сообщение
этот код и близко неподпадает под то что ты спрашивал в 1-м посту, короче нет времени тебе тут пересказывать книги так что давай сам иди и RTFM
Ладно, спасибо и на этом. Кстати, никто не знает, почему у меня кнопка "спасибо" пропала?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.10.2013, 15:47
Цитата Сообщение от Jupiter Посмотреть сообщение
этого не нужно делать, достаточно
C++
1
2
3
4
5
6
7
8
9
10
11
//LoadImages.h
class Event;
 
class LoadImages {
    ttfInit(Event*);
};
 
//LoadImages.cpp
void LoadImages::ttfInit(Event* p) {
    currentScore << p -> getCurrentCounter();
}
предварительного объявления в хедере
На всякий случай ссылка по теме:
Указатель на структуру - что напечатает программа
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.10.2013, 15:47
Помогаю со студенческими работами здесь

Раздельная компиляция (нюансы использования заголовочных файлов и файлов реализации)
Почему во многих учебниках функции-члены класса внутри класса только объявляют, но определяют вне самого класса (не, ну как бы в классе, но...

Подключение заголовочных файлов и файлов реализации
Здравствуйте,при создании класса в visual studio руками не компилится проект,при создании через add class все работает,для примера написал...

Подключение заголовочных файлов
Здравствуйте. Возникают ошибки при компиляции проекта: 1. Указывает на указатель: 2. Указывает на указатель и коллекцию указателей: ...

Подключение заголовочных файлов
Здравствуйте! Подскажите, можно ли сделать так, чтобы при создании нового консольного проекта, наиболее часто используемые файлы (например,...

Отличие заголовочных файлов
чем отличается string.h cstring string


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru