• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1109
  • Last Modified:

std::map copy constructor

Hi,


I'm using MS Visual Studio 2003 .NET. I'm also using the builtin std-map class (#include <map>).

I have something like this code:
----- code -----
class Obj
{
  string val;
};
typedef std::map<std::string, Obj> str_to_obj;

str_to_obj return_function( )
{
  str_to_obj ret;
  ret["abc"] = Obj( ... );
  return ret;
}
----- code -----

Where the problem is, is that when returning a str_to_obj from a function, it doesn't seem to copy neither the keys, neither the values... The only thing which is copied seems to be the amount of items in there, but no reasonable data in there... [in this example: abc is totally gone, the string ain't even copied!].

I checked the file, and it seems that std::map doesn't have a copy constructor...

So could anyone tell me how I can get a str_to_obj with meaningfull data back out of this function?


Thanks!
0
half_life_fool
Asked:
half_life_fool
  • 2
1 Solution
 
jkrCommented:
>>I checked the file, and it seems that std::map doesn't have a copy constructor...

It has: map(const map& x);

But, does 'Obj' have a copy constructor and assignment operator?
0
 
half_life_foolAuthor Commented:
looks like i have a bugged version of std::map then??

file: Microsoft Visual Studio .NET 2003/Vc7/include/map
----- code ------
      map()
      explicit map(const key_compare& _Pred)
      map(const key_compare& _Pred, const allocator_type& _Al)
      template<class _Iter>
            map(_Iter _First, _Iter _Last)
      template<class _Iter>
            map(_Iter _First, _Iter _Last,
                  const key_compare& _Pred)
      template<class _Iter>
            map(_Iter _First, _Iter _Last,
                  const key_compare& _Pred, const allocator_type& _Al)
----- code ------

Obj is a struct, not a class sorry (if that would make any difference). And no, Obj has no copy nor assign operator.

But also the std::string (key) is not being copied over to the target map... So it wouldn't be only the Obj it's problem?
0
 
half_life_foolAuthor Commented:
Ok, never mind... I was looking at the wrong variables... It will probably be another bug in my program why the .find() function doesn't work properly.

Thanks for your help jkr!


----- code -----
// copyconst.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>
#include <map>

using namespace std;

struct Obj
{
  Obj( const string& val = "" )
    : abc(val) { }

  string abc;
};
typedef map<string, Obj> str_to_obj;


string
getstr( const char* c )
{
  char * b = new char[ strlen(c) + 1 ];
  strcpy(b, c);
  b[strlen(c)] = '\0';
 
  string retval(b);
  delete [] b;

  return retval;
}

#define TEST(a)  retVal[getstr(#a)] = Obj(#a)


str_to_obj
return_function( )
{
  str_to_obj retVal;
  TEST(abc1);
  TEST(abc2);
  TEST(abc3);
  TEST(abc4);
  TEST(abc5);

  return retVal;
}

int _tmain(int argc, _TCHAR* argv[])
{
      str_to_obj test = return_function();

  for( str_to_obj::const_iterator ci = test.begin(); ci != test.end(); ci++ )
  {
    cout << "str_to_obj[" << ci->first << "] = Obj(" << ci->second.abc << ");" << endl;
  }
}

----- code -----
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now