【问题标题】:Cannot dynamic_cast不能dynamic_cast
【发布时间】:2015-07-11 22:42:26
【问题描述】:

我在尝试编译我的代码时遇到以下错误。

错误! ..\myCode\CPOI.cpp:68:41: 错误: 不能 dynamic_cast 'screenType'('struct CScreen*' 类型)输入'struct CGUIScreen*' (目标不是完整类型的指针或引用)

这是我的代码:

基类:

#include "CRoute.h"

enum screen_t{CRTScreen,GUIScreen};

class CScreen
{
    protected:    
        CRoute* m_pRoute;

    public:    
        virtual ~CScreen();
        virtual void connecToRoute(CRoute* route) = 0;
        virtual void drawRoute() = 0;
        virtual screen_t getScreenType() = 0;
};

派生类:

#include "CScreen.h"

class CGUIScreen : public CScreen
{
    public:
        void drawRoute();
        screen_t getScreenType();
        void connecToRoute(CRoute* route);
};

还有错误:

void CPOI::print(int format, CScreen* screenType)
{
    if(dynamic_cast<CGUIScreen*>(screenType)) 
    {
        cout << "printing POI GUI " << endl;
    }   
}

为什么会这样?

【问题讨论】:

  • 在派生类中创建虚拟方法,然后重试。您必须覆盖所有纯虚函数。
  • 请发帖minimal, complete, and verifiable example。这里没有任何问题。你确定你包含了你进行强制转换的派生类定义吗?

标签: c++ class casting abstract-class


【解决方案1】:

你没有展示足够的代码,所以只能猜测。

该错误可能是因为在编译违规语句时,编译器只能看到 CGUIScreen(也可能还有 CScreen)的前向声明。解决方案是#include 定义CGUIScreen 类的头文件,因此编译器可以看到dynamic_cast 的完整类定义。

或者,换句话说,像class CGUIScreen; 这样的前向声明对于像dynamic_cast&lt;CGUIScreen*&gt;(screenType) 这样的表达式是不够的。需要完整的类定义。

【讨论】:

  • 抱歉代码不完整。你是对的,谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 2018-04-29
  • 2023-03-18
  • 2011-06-06
  • 2011-10-09
  • 2011-05-11
相关资源
最近更新 更多