c++/cli Посоветуйте с include'ами

216
20 декабря 2016, 22:42

Есть понимание что у меня проблемы с инклудами. В данный момент есть программа с 4мя формами и кучей классов. Все классы я перечислил в отдельном .h файле и в формах ссылаюсь на него #include "includes.h" Проблема в том что со временем в программе накапливались классы и формы и includes.h рос. Классы стали пересекаться, один использует другой а в другом вызывается третий. Программа работает, но пришлось вставлять #include "includes.h" уже в .h файл каждой формы, потому что в какой то момент .h файл форм перестал видеть данный инклуд в .cpp файле формы. В результате классы компилируются по 10 раз для каждого инклуда, и в результате компиляция занимает достаточно много времени. Подскажите пожалуйста, как мне прописать все инклуды правильно?

Answer 1

Можно и

#pragma once

а можно обернуть весь .h файл в

#ifndef INCLUDES_H
#define INCLUDES_H
// все содержимое
#endif // INCLUDES_H

Второй вариант в данном случае так же хорош, а в целом - лучше, так как намного более распространен.

И все-таки действительно лучше определиться, кому какой класс нужен, и соответственно указывать includ'ы

Answer 2

Подскажите пожалуйста, как мне прописать все инклуды правильно?

Перво-наперво, как указали в удаленном сообщении - нужно использовать include-guard - методику, желательно в виде #pragma once. Это более современный способ. И это даст возможность однократного включения заголовков.

Второй момент - разбор с "бизнес-логикой". Когда классы работают "все-со-всеми", это заведомо глючный салат. Нужно определится "кто с кем взаимодействует". Если есть перекрестные взаимодействия - используйте упреждающие объявления. В принципе, одно из решений - упреждающие объявления и выносить их нужно отдельно, пусть в global_include.h. Например:

#pragma once
class ClassDrinkVodka;
class ClassRunToMaidan;
class ClassJumpForPeremoga;
class ClassZradaCry;

Тут последовательность взаимодействия заранее не определена. И именно этот файл можно включать глобально. А заголовки-реализации - по необходимости. Системы сборки уже сами будут смотреть за ситуацией, что изменено и что требуется перекопилировать.

Но лучше всего на один класс - одну пару (*.h и *.cpp) файлов. Несколько классов в файле оправдано только в том случае, если решается крайне локальный функционал.

READ ALSO
Можно ли писать приложение Android только на С++

Можно ли писать приложение Android только на С++

Я собираюсь научиться разрабатывать приложения под AndroidЯ знаю, что приложения под Android разрабатываются на java, но также можно и на С++

386
MySQL Expression must have integral or unscoped enum type. Mysql запрос

MySQL Expression must have integral or unscoped enum type. Mysql запрос

Не получается грамотно оформить запрос, функция принимает строку ("mysql("INSERT INTO history(path, date) VALUES ('" +ss+"','" + t + "')");") типа char, но в ней нельзя суммировать...

754
Консольные приложения и их возможности [требует правки]

Консольные приложения и их возможности [требует правки]

Изучения языка программирования начинается с консольных программМогут ли консольные программы применять в реальной жизни? Какого возможности...

299
error LNK2019: unresolved external symbol __imp_RegEnumValueA referenced in function

error LNK2019: unresolved external symbol __imp_RegEnumValueA referenced in function

Пытаюсь скомпилировать программу на С++, которая хочет прочесть данные о портах в реестреЗнаток С++ я небольшой, я по Java, а это JNI класс, для...

379