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

时间:2015-04-24 19:33:34

标签: c++ pointers queue

我正在尝试将(void **)对象转换为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 ** q作为参数传递给通信。变量通信是HashTable,其中密钥是房间名称,值是唯一的消息队列。我无法将void对象转换为队列。我无法更改find方法。

1 个答案:

答案 0 :(得分:0)

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

首先,您在未初始化find的情况下致电q,因此它实际上并未指向任何地方。因此,在find函数中取消引用时*data取消引用导致undefined behavior的未知指针。我认为您应该做的是将q声明为单个指针,然后将其地址传递给find函数(模拟< em>通过引用传递)。像

void *q;
...
communication.find(room, &q);

但是,由于你是用C ++编程的,所以我没有看到使用双指针来模拟传递引用,因为C ++内置了它:

bool HashTableVoid::find( const char * key, void *& data);

上面将参数data声明为对指针的引用。

第二个问题是您从指针q到变量data的分配:

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

你现在拥有的(没有上面的更改),q是一个指向指针的指针,你尝试将它作为单个指针使用,然后尝试转换为值。指针不是值,永远不能。

也许你的意思是

data = *reinterpret_cast<std::queue<char*>*>(q);  // After change detailed above