如何在具有循环依赖的类中dynamic_cast?
How to dynamic_cast in classes with circular dependency?
我想动态转换一个类:
啊:
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":未声明的标识符
我认为这是因为类B
和C
之间的循环依赖关系。 我该如何解决这个问题?
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文件中
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- C++类中的二维"dynamic"数组?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- protobuf in C++ with dynamic binding for google::protobuf::M
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- Shared_ptr cast vs static_cast speed
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- "The ordinal 344 could not be located in the dynamic link library"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- Dynamic Cast C++ Fail
- dynamic-cast-c++dynamic_cast错误处理