Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
25.10.2013, 10:56     Взаимное включение заголовочных файлов #1
Нужно передать объект по ссылке

Вот как сейчас:
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, т.е. взаимное включение будет.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2013, 10:56     Взаимное включение заголовочных файлов
Посмотрите здесь:

C++ Подключение заголовочных файлов
Отличие заголовочных файлов C++
Подключение заголовочных файлов C++
Включение заголовочных файлов C++
Подключение заголовочных файлов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
25.10.2013, 11:00     Взаимное включение заголовочных файлов #2
Цитата Сообщение от dimakozyr Посмотреть сообщение
т.к. Event.h уже инклудит файл LoadImages.h, т.е. взаимное включение будет.
Не будет в каждом новом файле если ты что то используешь, то его нужно обязательно подключать.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.10.2013, 11:02     Взаимное включение заголовочных файлов #3
Цитата Сообщение от 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();
}
предварительного объявления в хедере
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
25.10.2013, 11:02     Взаимное включение заголовочных файлов #4
dimakozyr, почему у ttfInit нет имени типа?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
25.10.2013, 11:03     Взаимное включение заголовочных файлов #5
Ты должен в файле Event.h делать защиту от повторного включения, да там у тебя по идее должны быть только объявления функций переменных, а объявлений может быть сколько угодно, главное что бы было только одно определение.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
25.10.2013, 11:42  [ТС]     Взаимное включение заголовочных файлов #6
Цитата Сообщение от 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 {};
то выдает, пропущена точка с запятой, а это, как я понимаю, потому что не определен базовый класс
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.10.2013, 11:48     Взаимное включение заголовочных файлов #7
Цитата Сообщение от 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();
}
начали с взаимного включения хедеров, а закончили глобальными статическими переменными
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
25.10.2013, 11:52  [ТС]     Взаимное включение заголовочных файлов #8
Цитата Сообщение от Jupiter Посмотреть сообщение
этот код и близко неподпадает под то что ты спрашивал в 1-м посту, короче нет времени тебе тут пересказывать книги так что давай сам иди и RTFM
Ладно, спасибо и на этом. Кстати, никто не знает, почему у меня кнопка "спасибо" пропала?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2013, 15:47     Взаимное включение заголовочных файлов
Еще ссылки по теме:

C++ Назначение заголовочных файлов
Иерархия заголовочных файлов C++
Правильное включение заголовочных файлов C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
25.10.2013, 15:47     Взаимное включение заголовочных файлов #9
Цитата Сообщение от 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();
}
предварительного объявления в хедере
На всякий случай ссылка по теме:
Указатель на структуру - что напечатает программа
Yandex
Объявления
25.10.2013, 15:47     Взаимное включение заголовочных файлов
Ответ Создать тему
Опции темы

Текущее время: 17:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru