gpt4 book ai didi

c++ - 将不同的对象存储为 void* 并从 void* 转换到 void*

转载 作者:太空宇宙 更新时间:2023-11-04 13:46:19 29 4
gpt4 key购买 nike

我正在尝试使用 void* 指针将不同的对象存储在一个全局表中。问题是如何取回 void* 对象。如果我有一个公共(public)基类,比如 Object ,我总是可以将 void* 指针存储为 Object,然后转换回 Object*。从 Object* 我可以进一步转换为特定类型。

class Object{};
class A : public Object{ virtual ~A()}
class B : public A { }
class C : public Object{ virtual ~C()}
class D: public C{};

A* aObj = new B;
void* v = static_cast<Object*>(aObj);

// scenario 1, try to get as A*
Object* obj = static_cast<Object*> (v);
A* vaobj = dynamic_cast<A*> ( obj); // ok

// scenario 2, try to get it as C*
Object* obj = static_cast<Object*> (v);
C* caobj = dynamic_cast<C*> ( obj); // ok, caObj will be null so I can throw exception if this happens

我知道当我有一个公共(public)基类时的解决方案是安全的,但问题是我不能有公共(public)基类,因为我不控制所有不同的类型,也不能从 Object 派生它们。没有公共(public)基类时的代码:

class A{ virtual ~A() }; class B : public A{};
class C{ virtual ~C() }; class D : public C{};

A* aObj = new B;
void* v = dynamic_cast<void*>(aObj);// to actually store the address of B

// scenario 1, try to retrieve object as A*
A* aObj2 = static_cast<A*>(v);
A* aa = dynamic_cast<A*> (aObj2); // aa should be non null

// scenario 2, try to retrieve object as C*
C* cObj = static_cast<C*>(v);
C* cc = dynamic_cast<C*>(cObj); // cc should be null

问题:

场景 1:我将 void* 指针与 B 的地址一起存储( dynamic_cast to void* 确实如此)。那我做static_cast with A* 我知道这不安全,因为我最初将对象作为 B* 存储在 void* ptr 中,而且我知道我们必须在 void* 中存储和检索相同类型的指针。但是,然后我进一步使用 dynamic_cast 进行转换以验证该对象实际上是正确的。所以这应该有效,并且 dynamic_cast 应该给我正确的对象?

场景 2:相同,但现在我首先将 static_casting 转换为 C*,然后进一步进行 dynamic_casting,这次我应该得到 NULL,因为存储的对象实际上是 B。

最佳答案

在 C++ 中几乎不需要存储 void* ,而在 C 中却很常见。 C++ 有更好、更类型安全的替代方案。例如,也许您可​​以使用 Boost.Any?

关于c++ - 将不同的对象存储为 void* 并从 void* 转换到 void*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25803330/

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