Как возвращающийся новичок в C ++, я пытаюсь отсортировать методологию #include.
Я следую определенному набору рекомендаций, которые подробно описаны ниже в следующем примере.До сих пор это сработало для меня (весь проект продолжает компилироваться :)), но я беспокоюсь, что у меня могут возникнуть проблемы в будущем, поэтому мои вопросы: это правильная методология?Есть ли лучший?Какая основная логика объясняет это?
Рассмотрим следующий пример:
Father.h
#pragma once
class Father
{
// Some implementation
};
ClassA.h
#pragma once
#include "Father.h"
#include "StructC.h"
class ClassB;
class ClassA : public Father
{
StructC struct_c_obj;
ClassB class_b_obj;
// Some implementation
};
ClassA.cpp
#include "Father.h"
#include "ClassB.h"
#include "StructC.h"
// Some implementation
ClassB.h и ClassB.cpp
Класс без включает
StructC.h
struct StructC {
// Some implementation
};
Я следую этим рекомендациям:
- Все * .hвозглавляются
#pragma once
декларацией - Если ClassA наследуется от класса Father, он должен включить его в файл * .h и * .cpp
- Если ClassA использует ClassB (и имеет ClassBпеременная, объявленная в области видимости класса), имеет
class ClassB;
декларацию в ClassA.h и #include "ClassB.h"
в ClassA.cpp - Если ClassA использует StructC (и имеет переменную StructC, объявленную в области видимости класса), он должен включать его как в ClassA.h, так и в ClassA.cpp
- Если ClassA использует ClassD или StructE, но только в файле ClassA.cpp, то он должен включать их только там
Этовероятно, неуклюжий набор руководящих принципов с небольшим пониманием основной логики, поэтому я, вероятно, собираюсь получить некоторый гнев ... Продолжайте это, я am пытаюсь изучить здесь...:)
ОБНОВЛЕНИЯ:
- Как некоторые написали ниже, у меня есть ошибка в примере - вы можете использовать предварительное объявление ClassB вClassA, только если ClassA имеет указатель или ссылку на ClassB, а не если он имеет простой элемент данных ClassB.