Depending on scope of variables etc.
Heinz Ozwirk wrote:
"Prasad" <prasadk14@gmail.com> schrieb im Newsbeitrag
news:1150735477.639775.267420@p79g2000cwp.googlegroups.com...
HI.
I have written the following code..in VC++(win32 console with MFC
support)
CMapStringToPtr chat;
vector<UserMessage *> v;
/*
UserMessage is a class..
*/
UserMessage *obj_msg=new
UserMessage(fromUser,fromUserName,'n',msg);
void * rValue;
CString toUser="abcd";
v.push_back(obj_msg); // Insering an object into vector v
chat.SetAt(toUser,&v); // Putting the vector 's reference
into map
"chat"
chat.Lookup(toUser,rValue);// Getting the vector 's reference
from
map "chat"
vector<UserMessage *> * vec=((vector<UserMessage *> *)rValue);
if(!vec->empty())
{
/* do some thing */
}
else
{
printf("Vector is empty");
}
///
It's not giving any compile errors...But..eventhough I put UserMessage
object into vector,
"Vector is empty " is being displayed on console..
(
I think the problem is with map Lookup function and typecasting
statement
vector<UserMessage *> * vec=((vector<UserMessage *> *)rValue);
)
I am just guessing it..
As long as you don't show any code that compiles and reproduces the problem,
I can do nothing else. But some general comments:
As the code is too big to be shown here,
I try my best to minimise the code to make u understand the problem
here....
class UserMessage
{
public:
CString fromUser;
CString fromUserName;
char delivered;//booleal contains 'y' or 'n'
CString msg;
UserMessage(CString fromUser,CString fromUserName,char
delivered,CString msg)
{
this->fromUser=fromUser;
this->fromUserName=fromUserName;
this->delivered=delivered;
this->msg=msg;
}
};
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
CMapStringToPtr chat;
vector<UserMessage *> v;
UserMessage *obj_msg=new UserMessage("prasad","Prasad",'n',"Hi
how r u ?");
void * rValue;
CString toUser="prasad";
v.push_back(obj_msg);
chat.SetAt(toUser,&v); /// storing the vector's reference in
Map variable "chat"
chat.Lookup(toUser,rValue); //getting the vector's refrence
from Map
vector<UserMessage *> *vec=((vector<UserMessage *> *)rValue);
if(!vec->empty())
{
UserMessage *u=vec->at(0);
cout<<(LPCSTR)u->msg<<endl;
}
else
{
printf("Vector is empty");
}
}
return nRetCode;
}
this is working as I want it to be,,,(displays the msg "Hi how r u ?"
on console)
But If i insert the vector 's reference in one block of code
UserMessage *obj_msg=new UserMessage("prasad","Prasad",'n',"Hi how r
u ?");
void * rValue;
CString toUser="prasad";
v.push_back(obj_msg);
chat.SetAt(toUser,&v); /// storing the vector's reference in
Map variable "chat"
,and get the vector's reference in another block of code like
chat.Lookup(toUser,rValue); //getting the vector's refrence from Map
vector<UserMessage *> *vec=((vector<UserMessage *> *)rValue);
if(!vec->empty())
{
}
else
{
printf("Vector is empty");
}
, ( map variable 'chat' is global ) , always its been dispalyed that
"Vector is empty"..
Here I am storing the vector's reference into map in first block of
code and trying to reference the vector in second block...
Wll the vector object created in the first block be lost as it comes
out of the scope?
If so, how can i solve this problem?
1) Think about using std::map instead of CMapStringToPtr. All those void*
used in some of MFC's container classes may cause many problems.
Is std::map available in predefined library or STL?
Initially ..i used map template from STL ,but if i include the
<hash_map> header file in my project , its conflicting with some other
header file which i used for thread template defintion( ou_thread.h
using namespace openutils )
if i include these two in a single project ,its giving compile errors..
Thats why i shifted to Mfc classes support for CMapStringToPtr class
2) Don't use vectors of pointers unless you really have to. And if you have
to use vectors of pointers, think about using some smart pointer.
I really need pointer to vector to be stored in map (as i thought i
could access the vector in another block of code) and also vector of
pointers (UserMessage *)..
How to use smart pointers here?
3) NEVER put a pointer to an object on the stack into a collection (unless
you really know what you are doing).
_____ No answer ..:-) ______
Heinz
Thanx,
Prasad