gpt4 book ai didi

c++ - 将 void 动态转换为类型的安全方法?

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:10 25 4
gpt4 key购买 nike

我的 C++ 有点生疏,我不记得标准中的所有内容。

我有一个void*。在一个特定的函数中,它要么是继承 Alpha 的类,要么是继承 Beta 的类。两个基类都有虚函数。但是我好像分不清哪个是哪个

class Alpha {
public:
virtual void Speak() { printf("A"); }
};
class Beta {
public:
virtual void Speak() { printf("B"); }
};
int main(){
//BAD CODE WILL PRINT TWICE
void *p = new Alpha;
Alpha*a = dynamic_cast<Alpha*>((Alpha*)p);
Beta*b = dynamic_cast<Beta*>((Beta*)p);
if(a)
a->Speak();
if(b)
b->Speak();
return 0;
}

我如何确定哪个类是哪个类?此代码库中有 100 个类被转换为 void。他们中的大多数继承了 5 个基类,但我并不急于找出答案。唯一的解决方案是继承自 class Dummy {public: virtual void NoOp(){}}; 并在使用动态转换之前转换为 Dummy 吗?这样安全吗?我希望有更好的解决方案,但我想不出别的。

最佳答案

唯一您可以对void* 指针做的事情是将其转换回完全与之前的指针相同的类型首先转换为 void*。做任何其他事情的行为是未定义的。

在你的情况下你可以做的是定义

class Base
{
public:
virtual ~Base() = default; // make me a polymorphic type and make
// polymorphic delete safe at the same time.
};

并将其作为 AlphaBeta 的基类。然后传递一个 Base* 指针而不是一个 void* 指针,并直接在 p 上获取你的 dynamic_cast .

请进一步注意,如果您在 Base 中声明了 virtual void Speak() = 0;,那么您在 main 中的代码将变得简单

int main(){ 
Base* p = new Alpha;
p->Speak();
delete p; // ToDo - have a look at std::unique_ptr
}

根据经验,任何类型的转换都是不可取的。

关于c++ - 将 void 动态转换为类型的安全方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55006471/

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