我在C ++中遇到了一个涉及循环依赖和继承的问题。
我已经实现了部分设计,我将使用pesudocode来说明问题发生的地方。
第一部分是:
//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
}
如您所见,编译器抛出“{token”之前的期望类名,这意味着Rel
未解析,但是为什么第一个没有继承的代码工作而第二个代码没有?我该如何解决这个问题?这是一种“错误”的模式吗?
我正在使用c ++ 14
我知道我遇到的问题有很多问题,但我找不到具体问题的答案。也许我没有看到它......
答案 0 :(得分:1)
由于你声明的所有变量都不需要知道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 :(得分:0)
原始的头文件需要由#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()
{
}