Ok this time I decided to make a list using the STL. I need to create a dedicated TCP socket for each client. So everytime I’ve got a connection, I instantiate a socket and add a pointer to it on a list.
list<MyTcp*> SocketList; //This is the list of pointers to sockets
list<MyTcp*>::iterator it; //An iterator to the list of pointers to TCP sockets.
Putting a new pointer to a socket was easy, but now every time the connection ends I should disconnect the socket and delete the pointer so I don’t get a huge memory leak, right? well.. I thought I was doing ok by setting this:
it=SocketList.begin();
while( it != SocketList.end() ){
if((*it)->getClientId() == id){
pSocket = it; // <-------------- compiler complains at this line
SocketList.remove(pSocket);
pSocket->Disconnect();
delete pSocket;
break;
}
}
But the compiler is saying this:
error: invalid cast from type ‘std::_List_iterator<MyTcp*>’ to type ‘MyTcp*’
Can someone help me here? i thought I was doing things right, isn’t an iterator at any given time just pointing to one of the elements of the set? how can I fix it?
Try this:
Iterators act a lot like pointers, but in reality they can be a pointer or a full-fledged class that acts like one. The important thing in this case, is that when you dereference one, you get whatever item is being stored in the container. Since you are storing
MyTcp*s in the list, when you dereference the iterator you get aMyTcp*.pSocketis of typeMyTcp*so the assignment above succeeds. The assignment you are trying to do is not dereferencing the iterator — you are trying to assign the iterator itself topSocket.It’s kind of like the following case: