[Search for users]
[Overall Top Noters]
[List of all Conferences]
[Download this site]
| Title: | C++ | 
| Notice: | Read 1.* and use keywords (e.g. SHOW KEY/FULL KIT_CXX_VAX_VMS) | 
| Moderator: | DECCXX::AMARTIN | 
|  | 
| Created: | Fri Nov 06 1987 | 
| Last Modified: | Thu Jun 05 1997 | 
| Last Successful Update: | Fri Jun 06 1997 | 
| Number of topics: | 3604 | 
| Total number of notes: | 18242 | 
3440.0. "ACCVIO getting object pointer from STL map" by CIM2NI::THORPE () Mon Feb 10 1997 11:14
I'm getting an access violation (look for the "ACCVIO here" near the
end of this code sample.
Basically I have a component manager class (BlahClassMgr) which
manages an STL map.  I would like to use the "lookup" member function
to return an object reference based on an input key.  If the key can
be found in the map then I would like to return, thru the arg list, a
pointer to the object referenced by the key.
I'm also curious why the "lookup" function cannot be "const".
Thanks in advance,
Bill
=======================================
// b.h
#include <map>
class BlahClass
{
friend ostream &operator<< ( ostream &stream ,const BlahClass &object );
private:
  int attr1;
  int attr2;
public:
  BlahClass (int a=0, int b=0) {attr1=a, attr2=b;}
  get_attr1 ( void ) { return this->attr1;}
  set_attr1 ( int b ) { this->attr1 = b;}
} *aBlahClassPtr;
// Insertor
  ostream &
  operator<< ( ostream &stream ,const BlahClass &object )
  {
    stream << "attr1: " << object.attr1 << "  attr2: " << object.attr2;
    return stream;
  }
typedef map<int, BlahClass, less<int> > list_t;
class BlahClassMgr
{
private:
  list_t blahs;
public:
  BlahClassMgr ( void )
    {
    BlahClass b1(1,11);
    BlahClass b2(2,22);
    BlahClass b3(3,33);
    blahs [ 1 ] = b1;
    blahs [ 2 ] = b2;
    blahs [ 3 ] = b3;
    for (list_t::iterator i=blahs.begin(); i != blahs.end(); i++)
      cout << (*i).second << endl;
    }
  bool lookup ( BlahClass *aBlah, const int &aKey )
    {
    list_t::iterator i;
    if ( (i = (this->blahs).find ( aKey )) == (this->blahs).end () )
      return FALSE;
    aBlah = &(*i).second;
    return TRUE;
    }
};
============================================
// b.cxx
#include "b.h"
main( void )
{
  BlahClassMgr aBlahClassMgr;
  bool joy = aBlahClassMgr.lookup ( aBlahClassPtr, 2 );
  if (joy)
    {
    cout << *aBlahClassPtr << endl;   // ACCVIO here
    aBlahClassPtr->set_attr1(99);     // ACCVIO here too
    }
  else
    cout << "Bummer man!" << endl;
}
| T.R | Title | User | Personal Name
 | Date | Lines | 
|---|
| 3440.1 |  | SPECXN::DERAMO | Dan D'Eramo | Mon Feb 10 1997 11:53 | 31 | 
|  | >  bool lookup ( BlahClass *aBlah, const int &aKey )
>    {
>    list_t::iterator i;
>    if ( (i = (this->blahs).find ( aKey )) == (this->blahs).end () )
>      return FALSE;
>    aBlah = &(*i).second;
>    return TRUE;
>    }
>};
>  bool joy = aBlahClassMgr.lookup ( aBlahClassPtr, 2 );
        The above does not result in an assignment to the variable
        aBlahClassPtr.  You would need to declare the first argument
        to lookup as a reference to a "BlahClass *"...
        
        	bool lookup ( BlahClass * &aBlah, const int &aKey )
        
        ...in order for the call...
        
        	aBlahClassMgr.lookup ( aBlahClassPtr, 2 )
        
        ...to result in a modification to aBlahClassPtr.
        
>I'm also curious why the "lookup" function cannot be "const".
        
        You probably can't assign the const_iterator returned by
        "find(const key_type &) const" to your iterator variable
        "i".
        
        Dan
 | 
| 3440.2 | thanks | CIM2NI::THORPE |  | Mon Feb 10 1997 12:31 | 4 | 
|  | That works.
Thanks,
Bill
 |