gpt4 book ai didi

c++ - 通过检测当前 'this' 对象类型在 C++ 中进行类型转换

转载 作者:搜寻专家 更新时间:2023-10-31 01:22:21 26 4
gpt4 key购买 nike

我的问题与 C++ 中的 RTTI 有关,我试图检查一个对象是否属于另一个对象的类型层次结构。 BelongsTo() 方法对此进行检查。我尝试使用 typeid,但它会引发错误,而且我不确定是否有任何其他方法可以找到要在运行时转换为的目标类型。

#include <iostream>
#include <typeinfo>

class X
{
public:
// Checks if the input type belongs to the type heirarchy of input object type
bool BelongsTo(X* p_a)
{
// I'm trying to check if the current (this) type belongs to the same type
// hierarchy as the input type
return dynamic_cast<typeid(*p_a)*>(this) != NULL; // error C2059: syntax error 'typeid'
}
};

class A : public X
{
};

class B : public A
{
};

class C : public A
{
};

int main()
{
X* a = new A();
X* b = new B();
X* c = new C();
bool test1 = b->BelongsTo(a); // should return true
bool test2 = b->BelongsTo(c); // should return false
bool test3 = c->BelongsTo(a); // should return true
}

使方法成为虚拟方法并让派生类执行这似乎是个坏主意,因为我在同一类型层次结构中有很多类。或者有人知道做同样事情的任何其他/更好的方法吗?请提出建议。

更新:b.BelongsTo(a) 应该检测输入对象类型 (a) 是否是类型层次结构中当前对象 (b) 的祖先。

最佳答案

这没有意义 - 您可以调用该函数这一事实意味着该参数属于 X 层次结构,因为这是参数的类型。动态转换旨在找出已知层次结构中的实际类型。

您的代码中的语法错误:

return dynamic_cast<typeid(*p_a)*>(this) != NULL;  

是因为 typeid 不是类型 - 你根本不能像那样将它用作带有 dynamic_cast 的类型。

如果像 Naveen 所建议的那样,您想了解一个实例是否属于子层次结构,请使用:

if ( dynamic_cast <A*>( some_x_ptr ) ) {

// yes, belongs to A sub-hierarchy
}

编辑:您有:

A <- P <- X
A <- Q <- Y

然后:

A * a = new X;

dynamic_cast <P *>( a ); // not null
dynamic_cast <Q *>( a ); // null

关于c++ - 通过检测当前 'this' 对象类型在 C++ 中进行类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2956404/

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