如何在具有循环依赖的类中dynamic_cast?

How to dynamic_cast in classes with circular dependency?

本文关键字:dynamic cast 依赖 循环      更新时间:2023-10-16

我想动态转换一个类:

啊:

class A
{
};

B.h:

class B
: public A
{
public:
void foo(A *a)
{
C* c = dynamic_cast<C*>(a);
}
};

C.h:

class C
: public A
{
public:
void foo(A *a)
{
B* b = dynamic_cast<B*>(a);
}
};

主.cpp:

#include "A.h"
#include "B.h"
#include "C.h"
int main()
{
}

编译时,出现以下错误:

"C":未声明的标识符

我认为这是因为类BC之间的循环依赖关系。 我该如何解决这个问题?

A.h

#ifndef _A_H
#define _A_H
class A
{
public:
int x{ 0 };
A() {}
virtual ~A() {}
};
// definition
class B
: public A
{
public:
B() {}
~B() override {}
void foo(A* a);
};
// definition
class C
: public A
{
public:
C() {}
~C() override {}
void foo(A* a);
};
#endif _A_H

答.cpp

#include "A.h" // NECESSARY !
#include <iostream>
void
B::
foo(A* a)
{
C* c = dynamic_cast<C*>(a);
if (c)
{
std::cout <<
"c->x = "
<< c->x
<< std::endl;
}
}
void
C::
foo(A* a)
{
B* b = dynamic_cast<B*>(a);
if (b)
{
std::cout <<
"b->x = "
<< b->x
<< std::endl;
}
}

主.cpp

#include "A.h"
int main()
{
B b;
b.x = 1;
C c;
c.x = 2;
b.foo(&c);
c.foo(&b);
return 0;
}

如果您使用的是gcc,请使用以下命令进行编译和执行:

g++ -std=c++17 -I. -o main A.cpp main.cpp 
&& ./main

运行程序后,您将从提示符中获得以下输出:

c->x = 2
b->x = 1

我的问题解决了。 解决方案是将头文件和实现文件.cpp分离,并将所有.h文件包含在.cpp文件中