C++ 将(void**)转换为C+中的对象+;

C++ 将(void**)转换为C+中的对象+;,c++,pointers,queue,C++,Pointers,Queue,我试图将一个(空**)对象转换成C++中的队列。 在一个文件HashTableVoid.cc中,我使用find方法: bool HashTableVoid::find( const char * key, void ** data) { // Add implementation here int i = hash(key); HashTableVoidEntry * node = _buckets[i]; while(node){ if(strcmp(node->_ke

我试图将一个(空**)对象转换成C++中的队列。 在一个文件HashTableVoid.cc中,我使用find方法:

bool HashTableVoid::find( const char * key, void ** data)
{
  // Add implementation here
  int i = hash(key);
  HashTableVoidEntry * node = _buckets[i];

while(node){
  if(strcmp(node->_key,key) == 0)
  {
    *data = node->_data;
    return true;
  }
  node = node->_next;
}
return false;
}
在IRCServer.cc中,我使用了

void IRCServer::sendMessage(int fd, const char * user, const char * password, const char * args)
{
//Get user's room

//Write to room messages
char * temp;
temp = strdup(args);
void ** q;
queue<char*> data;
const char * room = //Found Room;
communication.find(room, q);
data =  (queue<char*>) ((char *)q);
data.push(temp);
//Make sure only 100 elements or less in the list
while(data.size() > 100)
    data.pop();
}
void IRCServer::sendMessage(int-fd,const-char*用户,const-char*密码,const-char*参数)
{
//获取用户的房间
//给房间留言
字符*温度;
温度=标准值(args);
无效**q;
队列数据;
const char*room=//找到的房间;
沟通。查找(房间,q);
数据=(队列)((字符*)q);
数据推送(temp);
//确保列表中只有100个元素或更少
while(data.size()>100)
data.pop();
}

我正在创建
void**q
作为参数传递给通信。变量通信是一个哈希表,其中键是房间名称,值是唯一的消息队列。我无法将void对象转换为队列。我无法更改
find
方法。

我可以直接看到两个问题:

首先,在不初始化
q
的情况下调用
find
,因此它实际上并不指向任何地方。因此,当您取消引用do
*数据时,在
find
函数中,您取消引用指向的未知指针。我认为您应该做的是将
q
声明为单个指针,然后将该指针的地址传递给
find
函数(模拟按引用传递)。像

但是,由于您在C++中编程,所以我不认为使用双指针模拟按引用传递,因为C++内置了:

bool HashTableVoid::find( const char * key, void *& data);
上面声明了参数
data
作为指针的引用


第二个问题是从指针
q
到变量
数据的赋值:

data =  (queue<char*>) ((char *)q);

到目前为止你做了什么?你到底遇到了什么麻烦?“麻烦”可能意味着很多事情。当你发布代码试图缩进代码时,一个技巧是避免代码中的制表符。为什么要使用q呢,他可以在将数据传递给findYou时直接转换
数据你在重新解释中缺少一个“>”和一个“(”。它看起来像这样吗:data=(重新解释)(q);?@CyberSpock你有什么建议吗?
data =  (queue<char*>) ((char *)q);
data = *reinterpret_cast<std::queue<char*>*>(q);  // After change detailed above