0

我在 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
}

如您所见,编译器会抛出“{ token 之前的预期类名”,这意味着Rel没有解决,但为什么没有继承的第一个代码有效而第二个代码无效?我该如何解决?这是一个“错误”的模式吗?

我正在使用 c++14

我知道有很多关于我遇到的问题的问题,但我找不到具体问题的答案。可能我没看到...

4

2 回答 2

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()  { ... }
于 2017-11-23T15:40:51.117 回答
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()
{
}
于 2017-11-23T16:52:23.097 回答