C++ 需要在代码之前定义类定义的动态_cast问题

C++ 需要在代码之前定义类定义的动态_cast问题,c++,dynamic-cast,C++,Dynamic Cast,我目前在dynamic_cast以及如何构建代码方面存在问题。所以我有一个Manager类,它获取一个指针并尝试检查它是否是派生对象,如果是,在if语句中运行一些额外的代码。但是为了使动态\u转换工作,它要求类定义在实际的动态\u转换使用之前 因此,我交换了类管理器和类派生定义的位置,以使派生类的定义早于管理器类。但是现在,我收到错误消息,说“Manager”是一个未定义的类型。我猜,为了将Manager作为引用传递,派生类需要首先定义Manager的类定义 我能想到的最好的解决方案是,不要将M

我目前在dynamic_cast以及如何构建代码方面存在问题。所以我有一个Manager类,它获取一个指针并尝试检查它是否是派生对象,如果是,在if语句中运行一些额外的代码。但是为了使动态\u转换工作,它要求类定义在实际的动态\u转换使用之前

因此,我交换了类管理器和类派生定义的位置,以使派生类的定义早于管理器类。但是现在,我收到错误消息,说“Manager”是一个未定义的类型。我猜,为了将Manager作为引用传递,派生类需要首先定义Manager的类定义

我能想到的最好的解决方案是,不要将Manager类作为引用传递,而是将其作为指针传递(我不太喜欢这样,因为我知道Manager类始终是一个有效指针,所以将其作为指针是毫无意义的)。我只是想知道是否有比我现有的更好的替代方案

提前非常感谢

编辑:不幸的是,我需要将所有的类定义和实现放在一个文件中,所以将它们拆分为.h和.cpp文件就不太理想了。有人问,是的,这是家庭作业,但我的教授想把它放在一个文件里

class BaseClass
{
    virtual VirtualClassName() = 0;
};

class Manager
{
    void FunctionNameOne(const BaseClass* const ClassPointer)
    {
        if(Derived* DerviedPtr = dynamic_cast<Derived*>(ClassPointer))
        {
            //Do stuff with DerviedPtr
        }
    }   
};

class Derived : public BaseClass
{
    Void FunctionNameTwo(const Manager& Manager)
    {
        //Do stuff with Manager
    }
};
类基类
{
虚拟VirtualClassName()=0;
};
班级经理
{
void FunctionNameOne(常量基类*常量类指针)
{
if(派生*DerviedPtr=dynamic_cast(类指针))
{
//与DerviedPtr合作
}
}   
};
派生类:公共基类
{
Void functionname2(施工经理和经理)
{
//和经理一起做事
}
};

通常,您将声明放入项目的
.h
文件中,并将方法的实现放入
.cpp
文件中


如果按照这种方式操作,所有类定义都是已知的,并且在这种情况下可以毫无问题地使用动态强制转换。

通常,您将声明放入项目的
.h
文件中,并将方法的实现放入
.cpp
文件中


如果按照这种方式操作,所有的类定义都是已知的,在这种情况下,您可以毫无问题地使用动态强制转换。

我必须清理代码,您至少应该有格式良好的代码可以使用,否则您的错误消息将毫无意义

class BaseClass
{
    virtual void VirtualClassName() = 0;
};

class Manager
{
    void FunctionNameOne(const BaseClass* const ClassPointer);
};

class Derived : public BaseClass
{
    void FunctionNameTwo(const Manager& Manager)
    {
        //Do stuff with Manager
    }
};

void Manager::FunctionNameOne(const BaseClass*  ClassPointer)
{
    if (const Derived* DerviedPtr = dynamic_cast<const Derived*>(ClassPointer))
    {
        //Do stuff with DerviedPtr
    }
}
类基类
{
虚拟void VirtualClassName()=0;
};
班级经理
{
void FunctionNameOne(常量基类*常量类指针);
};
派生类:公共基类
{
void functionname2(施工经理和经理)
{
//和经理一起做事
}
};
无效管理器::FunctionNameOne(常量基类*类指针)
{
if(常量派生*DerviedPtr=dynamic_cast(类指针))
{
//与DerviedPtr合作
}
}

请注意,我定义了
FunctionNameOne
并在声明了
Derived
之后使用了动态强制转换。我必须清理代码,您至少应该有格式良好的代码可以使用,否则错误消息将毫无意义

class BaseClass
{
    virtual void VirtualClassName() = 0;
};

class Manager
{
    void FunctionNameOne(const BaseClass* const ClassPointer);
};

class Derived : public BaseClass
{
    void FunctionNameTwo(const Manager& Manager)
    {
        //Do stuff with Manager
    }
};

void Manager::FunctionNameOne(const BaseClass*  ClassPointer)
{
    if (const Derived* DerviedPtr = dynamic_cast<const Derived*>(ClassPointer))
    {
        //Do stuff with DerviedPtr
    }
}
类基类
{
虚拟void VirtualClassName()=0;
};
班级经理
{
void FunctionNameOne(常量基类*常量类指针);
};
派生类:公共基类
{
void functionname2(施工经理和经理)
{
//和经理一起做事
}
};
无效管理器::FunctionNameOne(常量基类*类指针)
{
if(常量派生*DerviedPtr=dynamic_cast(类指针))
{
//与DerviedPtr合作
}
}

请注意,我定义了
FunctionNameOne
,并在声明
Derived

related/dupe之后使用动态强制转换:首先,在类定义之后需要分号。通常的做法是让变量以小写字符开头(或者在成员变量的情况下使用下划线+小写)。很难判断您指的是类型
Manager
还是实例(嗯,const reference)
const Manager&Manager
。您熟悉“转发声明”的概念吗?这可能正是您所需要的。您的问题实际上源于希望使用
dynamic\u cast
。解决这个问题;重新构造代码,使您不需要它。为什么
Manager::FunctionNameOne
需要了解
派生的
,即使它将
基类
作为类型?相关/重复:首先,在类定义之后需要分号。通常的做法是让变量以小写字符开头(或者在成员变量的情况下使用下划线+小写)。很难判断您指的是类型
Manager
还是实例(嗯,const引用)
const Manager&Manager
,否则。您熟悉“转发声明”的概念吗?它可能正是您所需要的。您的问题实际上源于希望使用
动态\u cast
。解决这个问题;重新构造您的代码以便您不需要它。为什么
Manager::FunctionNameOne
需要了解
派生的
,即使它将
基类
作为类型?我已经编辑了我的问题,您会怎么做如果将它们拆分为.h和.cpp文件并不理想,这是一个好方法吗?@JamesL您仍然可以将方法定义移动到同一文件的底部哦!我明白您的意思了!非常感谢,我认为这比让一个函数使用指针要好。请注意,您可能仍然需要前向声明来编写函数decl位于顶部的arations。我编辑了我的问题,如果将它们拆分为.h和.cpp文件并不理想,那么什么是好方法?@JamesL您仍然可以将方法定义移到同一文件的底部哦!我明白您的意思了!非常感谢