Циклические зависимости обычно занимают много времени для компиляции?

РЕДАКТИРОВАТЬ: Модифицированные заголовочные файлы с защитой. Я забыл поставить их в этом примере. Хотя у меня уже были те в моем проекте.

У меня есть два предложения.

Файл a.h:

#ifdef A_H
#define A_H
#include "b.h"#include "x.h" //not related to problem, is just included
class B; //fwd declaration, needed to use getB() outside of A
class A
{
public:
A(X &x);
B &getB();
...
private:
X &x;
}
#endif

Файл b.h:

#ifdef B_H
#define B_H
#include "x.h"class A; //fwd declaration
class B
{
public:
B(X &x, A &a);
void methodThatUsesA();
...
private:
X &x;
A &a;
}
#endif

Файл a.cpp:

#include "a.h"#include "b.h"A::A(X &x):x(x){}
B& A::getB()
{
static B b(x, *this);
return b;
}
...

Файл b.cpp:

#include "b.h"#include "a.h"B::B(X &x, A &a) : x(x), a(a){}
void B::methodThatRequiresA(){
//does its thing...
}

Со стороны я использую их так:

#include "x.h"#include "a.h"X x(...);
A a(x);
a.getB().methodThatRequiresA();

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

Циклические зависимости занимают так много времени для компиляции? Если это так, компиляция проектов с множеством циклических зависимостей может занять много времени.

0

Решение

Компиляция большого проекта, особенно с оптимизацией, может занять довольно много времени. Но в вашем случае виновником является то, что вы не используете охрану в своем заголовке, и компилятор должен анализировать один и тот же заголовочный файл несколько раз. Таким образом, решение может быть (для файла a.h):

#ifndef A_H_
#define A_H_
//
//

#endif // A_H_

Для этого есть разные решения, такие как прагма от MS VS и т. Д., Но это самый переносимый способ IMO. Символ не обязательно должен быть таким, но должен быть уникальным.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector