gpt4 book ai didi

c++ - 在条件中更改对象类型

转载 作者:行者123 更新时间:2023-11-30 04:38:49 24 4
gpt4 key购买 nike

我在使用 dynamic_casting 时遇到了一些麻烦。我需要在运行时确定对象的类型。这是一个演示:

#include <iostream>
#include <string>

class PersonClass
{
public:
std::string Name;
virtual void test(){}; //it is annoying that this has to be here...
};

class LawyerClass : public PersonClass
{
public:
void GoToCourt(){};
};

class DoctorClass : public PersonClass
{
public:
void GoToSurgery(){};
};

int main(int argc, char *argv[])
{

PersonClass* person = new PersonClass;
if(true)
{
person = dynamic_cast<LawyerClass*>(person);
}
else
{
person = dynamic_cast<DoctorClass*>(person);
}

person->GoToCourt();


return 0;
}

我想做上面的事情。我发现唯一合法的方法是事先定义所有对象:

  PersonClass* person = new PersonClass;
LawyerClass* lawyer;
DoctorClass* doctor;

if(true)
{
lawyer = dynamic_cast<LawyerClass*>(person);
}
else
{
doctor = dynamic_cast<DoctorClass*>(person);
}

if(true)
{
lawyer->GoToCourt();
}

这样做的主要问题(除了必须定义一堆不会使用的对象之外)是我必须更改“person”变量的名称。有没有更好的办法?

(我不允许更改任何类(Person、Lawyer 或 Doctor),因为它们是将使用我的代码的人拥有并且不想更改的库的一部分)。

谢谢,

戴夫

最佳答案

动态转换到子类,然后将结果分配给指向父类(super class)的指针是没有用的——您实际上回到了起点。您确实需要一个指向子类的指针来存储动态转换的结果。此外,如果对象的具体类型是 PersonClass,则不能将其向下转换为子类。只有当你有一个指向父类(super class)的指针时,动态转换才对你有用,但你知道指向的对象实际上是一个子类的实例

正如其他人也指出的那样,最好的选择是重新设计类层次结构,使您的方法真正具有多态性,从而消除向下转换的需要。由于您无法接触这些类(class),因此您需要沮丧。典型的使用方式是这样的

PersonClass* person = // get a Person reference somehow

if(/* person is instance of LawyerClass */)
{
LawyerClass* lawyer = dynamic_cast<LawyerClass*>(person);
lawyer->GoToCourt();
}
else
{
DoctorClass* doctor = dynamic_cast<DoctorClass*>(person);
doctor->GoToSurgery();
}

更新:如果你以后想使用子类实例,你可以这样做:

PersonClass* person = // get a Person reference somehow
...
LawyerClass* lawyer = NULL;
DoctorClass* doctor = NULL;

if(/* person is instance of LawyerClass */)
{
lawyer = dynamic_cast<LawyerClass*>(person);
}
else if(/* person is instance of DoctorClass */)
{
doctor = dynamic_cast<DoctorClass*>(person);
}
...
if(lawyer)
{
lawyer->GoToCourt();
}
else if (doctor)
{
doctor->GoToSurgery();
}

请注意,这段代码比之前的版本更复杂也更容易出错。我肯定会尝试重构此类代码,使其看起来更像以前的版本。 YMMV.

关于c++ - 在条件中更改对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2932423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com