Циклическая зависимость и ошибка компиляции наследования при переполнении стека

У меня есть проблема в C ++, которая включает циклические зависимости и наследование.

Я реализовал дизайн по частям, и я буду использовать псевдокод, чтобы проиллюстрировать, где возникает проблема.

Первая часть:

//app.h

include rel.h

class Rel; // forward declaration

class App {
shared_ptr<Rel> //member variable
}

//rel.h

include app.h

class App; //forward declaration

class Rel {
shared_ptr<App> //member variable
}

До этого момента программа компилируется без предупреждений

Затем я хочу добавить наследование следующим образом:

//app.h

include rel.h
include drel.h

class Rel; // forward declaration
class DRel // forward declaration

class App {
shared_ptr<Rel> //member variable
shared_ptr<DRel> //member variable
}

//rel.h (the same as before)

include app.h

class App; //forward declaration

class Rel {
shared_ptr<App> //member variable
}

//drel.h

include app.h
include rel.h

class App; //forward declaration

class DRel: Rel { // compile error here: expected class name before { token
shared_ptr<App> //member variable
}

Как видите, компилятор выдает «ожидаемое имя класса перед {токеном», что означает, что Rel не решена, но почему первый код без наследования работает, а второй — нет? Как я могу это исправить? Это «неправильный» шаблон?

Я использую с ++ 14

Я знаю, что есть много вопросов, касающихся моих проблем, но я не могу найти ответ на свою конкретную проблему. Может я этого не вижу …

0

Решение

Поскольку все объявленные вами переменные не должны знать пространство, занимаемое App, Rel и DRel, вам даже не нужно #include заголовки, о которых вы говорите, вы просто должны объявить имя вперед, как вы делаете.

Так у тебя есть ты .h с

class A;
class B;

class C {
std::shared_ptr<A> ptra;
std::shared_ptr<B> ptrb;
};

А потом твой .cpp с

#include "A"#include "B"
C::C()  { ... }
1

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

Исходные заголовочные файлы должны быть защищены #ifdefs следующим образом:

#ifndef CYCLIC_DEPENDECY_1
#define CYCLIC_DEPENDECY_1
#include "cyclic_dependency2.h"class Rel; // forward declaration

class App {
std::shared_ptr<Rel> test; //member variable
};
#endif#ifndef CYCLIC_DEPENDECY_2
#define CYCLIC_DEPENDECY_2
#include "cyclic_dependency1.h"
class App; //forward declaration

class Rel {
std::shared_ptr<App> test;//member variable
};
#endif#include <iostream>
#include <memory>
#include "cyclic_dependency2.h"
class Rel; // forward declaration
class DRel; // forward declaration

class DRel: Rel {
std::shared_ptr<App> test ;//member variable
};

main()
{
}
0

По вопросам рекламы [email protected]