我正在尝试将(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
方法。
答案 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