Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;当强制类型仅为字符串时,使用动态强制类型转换_C++_Types_Casting_Dynamic Cast - Fatal编程技术网

C++ c++;当强制类型仅为字符串时,使用动态强制类型转换

C++ c++;当强制类型仅为字符串时,使用动态强制类型转换,c++,types,casting,dynamic-cast,C++,Types,Casting,Dynamic Cast,我有几个类是从另一个类派生出来的 class t1 : fu class t2 : fu .... 我必须首先动态创建fu的对象,然后将其转换为派生类 这将是一种静态工作方式: t1 vart1_1 = dynamic_cast<t1 *>(fu1); t1 vart1_2 = dynamic_cast<t1 *>(fu2); t2 vart2_1 = dynamic_cast<t2 *>(fu3); 我想遍历列表,用fuName创建fu对象,如果可能的话

我有几个类是从另一个类派生出来的

class t1 : fu
class t2 : fu
....
我必须首先动态创建
fu
的对象,然后将其转换为派生类

这将是一种静态工作方式:

t1 vart1_1 = dynamic_cast<t1 *>(fu1);
t1 vart1_2 = dynamic_cast<t1 *>(fu2);
t2 vart2_1 = dynamic_cast<t2 *>(fu3);
我想遍历列表,用fuName创建fu对象,如果可能的话,可以这样做:

type fuName = dynamic_cast<type *>(fu);
type fuName=dynamic_cast(fu);
另一个问题是我无法更改fu及其派生类


我希望你能理解我想要的东西。

< P>你没有在C++中的思考,因此你不能轻易地完成你想要做的事情。 我所看到的每一次试图破解语言内部反射的尝试都被证明是很好的。。只是一个非常糟糕的黑客

另一种解决方案是尝试将其强制转换为所有派生类,如果转换不成功,dynamic_cast将返回一个nullptr


这表示存在设计问题,但是,您不需要这样做。

如果您有一个类名列表和执行强制转换的替代方法,那么您需要检查指针的typeid,然后将字符串与列表进行比较,以获得要调用的方法,有关typeid的更多信息,请阅读此

也许其他人可以确认,但我看到的主要问题是,在编译过程中必须知道变量名,因此试图在运行时从
字符串创建这些名称是行不通的。这有点混乱,但听起来您可能需要一个工厂。。。基本思想是使用一些输入(如类型名称)在多个
new-DerivedX
/
new-DerivedY
/。。。案例。该函数返回一个基类指针,以便于在容器中存储混合的运行时类型。基类需要一个虚拟析构函数可能是
type*fuName=dynamic\u cast(fu)
类型fuName=*动态(fu)这似乎是一种情况,在这种情况下,了解您试图用非抽象的术语实现什么是很有帮助的,因为您正在描述的反射类型目前实际上是不可能的。谁在创造这些富物?你能控制那个代码吗?谁在消费这些物品?你能控制那个代码吗?你的问题不存在于真空中。即使这可以做到,你会如何利用它?如果您在compiletime不知道派生类的类型,则不能在
fuName
上调用派生类的方法。我会使用返回函数名称的静态方法手动执行此操作。typeid不可移植。@dau_sama这也是一个解决方案,如果typeid适用于他的环境,也可以。
type fuName = dynamic_cast<type *>(fu);