我对reinterpret_castvs 的适用性感到困惑static_cast.从我读到的一般规则是使用静态转换,当类型可以在编译时解释,因此这个词static.这是C++编译器内部用于隐式转换的转换.
reinterpret_casts适用于两种情况,将整数类型转换为指针类型,反之亦然,或将一种指针类型转换为另一种指针类型.我得到的一般想法是不可移植的,应该避免.
我有点困惑的地方是我需要的一种用法,我从C调用C++并且C代码需要保持C++对象,所以基本上它拥有一个void*.什么演员应该用于在void *类型和类型之间进行转换?
我看过两者的用法static_cast和reinterpret_cast?虽然从我读过的内容看起来似乎static更好,因为演员阵容可以在编译时发生?虽然它说用于reinterpret_cast从一种指针类型转换为另一种指针类型?
我有一个使用SDL的C++项目,特别是SDL事件.我想将事件系统用于传入的网络消息,就像它用于UI事件一样.我可以定义一个新的事件类型并附加一些任意数据(参见这个例子).如果我使用普通指针,这就是我要做的事情:
Uint32 message_event_type = SDL_RegisterEvents(1);
/* In the main event loop */
while (SDL_Poll(&evt)) {
if (evt.type == message_event_type) {
Message *msg = evt.user.data1;
handle_message(msg);
}
}
/* Networking code, possibly in another thread */
Message *msg = read_message_from_network();
SDL_Event evt;
evt.type = message_event_type;
evt.user.data1 = msg;
SDL_PostEvent(evt);
Run Code Online (Sandbox Code Playgroud)
相反,我一直在使用shared_ptr<Message>.消息一旦构造就是只读对象,并且在处理时可能在很多地方使用,所以我想为它们使用shared_ptr.
我想将shared_ptr用于网络端的消息,也可以在事件处理端使用.如果我这样做:
// in networking code:
shared_ptr<Message> msg = ...
evt.user.data1 = msg.get();
// later, in event handling:
shared_ptr<Message> msg(evt.user.data1);
Run Code Online (Sandbox Code Playgroud)
然后有两个独立的shared_ptrs,任何一个都可以删除Message对象,而其中一个仍在使用它.我需要以某种方式通过SDL_UserEvent结构传递shared_ptr,该结构只有几个void *和int字段.
额外.注意 …
我有一个具有指针作为成员的结构:
struct MyStruct {
char *ptr;
}
Run Code Online (Sandbox Code Playgroud)
我想在一个范围内初始化 ptr,然后能够在该范围之外使用它:
{ // scope 0
{ //scope 1
{ // scope 2
mystruct.ptr = new char[100];
}
// mystruct.ptr still lives here
}
// i dont need mystruct anymore
delete[] mystruct.ptr;
}
Run Code Online (Sandbox Code Playgroud)
但后来我必须删除它,这很容易出错,我宁愿避免这样做。所以我想到使用std::shared_ptr.
{ // scope 0
{ //scope 1
{ // scope 2
auto a = std::make_shared<char>(new char[100]);
mystruct.ptr = a.get(); // ??????? HOW TO ASSIGN
}
// mystruct.ptr still SHOULD live here
}
}
Run Code Online (Sandbox Code Playgroud)
那么,我该怎么办呢?我应该如何将shared_ptr分配给mystruct.ptr以使所有权计数变为2?我看到 get() 不起作用,因为它只是传递指针但不给出所有权,因此它被删除。
如您所见,这里的主要动机是延长寿命,因此我对其他做法持开放态度。也许我在这里使用shared_ptr的想法是错误的?