Ненужные включения в с ++ - PullRequest
0 голосов
/ 29 мая 2018

Мой вопрос о включении в C ++.Представьте себе эти 3 .h файла

// A.h
#include "B.h"
class A {
    B b;
}
// B.h
#include "C.h"
class B {
    C c;
}
// C.h
class C {

}

Проблема здесь в том, что Ah нуждается в доступе к Bh, а не Ch

Ah может в этой ситуации получить доступ к Ch черезBh, так что это ненужное включение.В последнее время я много в этой ситуации, поэтому мне интересно, как можно избежать этой ситуации.

Ответы [ 4 ]

0 голосов
/ 29 мая 2018

Используйте include guard, как предложено выше.

#ifndef _A_H_
#define _A_H_
#include B.h
class A {
    B b;
}
#endif

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

class B;
class A {
    B * b;
}
0 голосов
/ 29 мая 2018

Проблема здесь в том, что Ah нуждается в доступе к Bh, но не в Ch

В вашем коде нет ненужных включений.A.h не обязательно должен включать C.h напрямую, но A.h не может использовать B.h без (косвенно), включая C.h

0 голосов
/ 29 мая 2018

Я не думаю, что это можно сделать.В c ++ препроцессор, который включает директивы #include, возвращает текстовый файл, который затем обрабатывает фактический компилятор.В настоящее время это единственный способ вставить код в ваш проект.Если B.h нужно C.h, оно должно быть в текстовой форме до A.h.

Компилятор c ++ не может "забыть" ранее требуемые определения в одной единице перевода.

0 голосов
/ 29 мая 2018

Прежде всего;во многих ситуациях вам не нужно полное определение типа (при использовании только указателя или ссылки на него или при использовании его в качестве возвращаемого значения).В этих случаях вы можете использовать предварительные объявления вместо включения полного заголовка.Во-вторых,если у ваших заголовков есть соответствующие защитные элементы, то их многократное включение обходится очень дешево.

Я не знаю хороших инструментов для поиска ненужных включений (пробовал инструмент "включай то, что ты используешь" в Google), но не очень хорошо работает в моем опыте).Я просто боюсь, что вам придется использовать свои знания кода для выявления ненужных включений и удаления их вручную.

...