Смешение C и C ++, сырых указателей и (буст) общих указателей - PullRequest
0 голосов
/ 07 марта 2011

Я работаю в C ++ с некоторым устаревшим кодом C.

У меня есть структура данных, которая (во время инициализации) создает копию структуры, указывающей на ptr, переданный ее указателю инициализации.

Вот упрощение того, что я пытаюсь сделать- надеюсь, ни одна важная деталь не была потеряна в «упрощении»:

/* C code */

typedef struct MyData
{
   double * elems;
   unsigned int len;   
};

int NEW_mydata(MyData* data, unsigned int len)
{
    // no error checking
    data->elems = (double *)calloc(len, sizeof(double)); 
    return 0;
}

typedef struct Foo
{
   MyData data data_;
};


void InitFoo(Foo * foo, const MyData * the_data)
{
   //alloc mem etc ... then assign the STRUCTURE
   foo.data_ = *thedata ;
}


C++ code
-------------
typedef boost::shared_ptr<MyData> MyDataPtr;
typedef std::map<std::string, MyDataPtr> Datamap;

class FooWrapper
{
public:
   FooWrapper(const std::string& key) {
       MyDataPtr mdp = dmap[key];
       InitFoo(&m_foo, const_cast<MyData*>((*mdp.get())));
   }

   ~FooWrapper();

   double get_element(unsigned int index ) const {
      return m_foo.elems[index];
   }

private:
   // non copyable, non-assignable
   FooWrapper(const FooWrapper&);
   FooWrapper& operator= (const FooWrapper&);

   Foo m_foo;
};



int main(int argc, char *argv[])
{ 

   MyData data1, data2;
   Datamap dmap;

   NEW_mydata(&data1, 10);
   data1->elems[0] = static_cast<double>(22/7);

   NEW_mydata(&data2, 42);
   data2->elems[0] = static_cast<double>(13/21);

   boost::shared_ptr d1(&data1), d2(&data2);

   dmap["data1"] = d1;
   dmap["data2"] = d2;

   FooWrapper fw("data1");


   //expect 22/7, get something else (random number?)
   double ret fw.get_element(0);    
}

По сути, я хочу знать следующее:

Есть ли какая-то причина, почему данные, полученные изкарта отличается от той, что хранится на карте?

1 Ответ

1 голос
/ 07 марта 2011

Использование оператора [] карты для вставки элемента приведет к удалению предыдущих данных, сохраненных на том же ключе, попробуйте вместо этого использовать insert . То же самое относится и к получению данных с карты, оператор [] создаст элемент, если ваш Ключ не сохранен, попробуйте вместо этого использовать find .

Также const_cast<MyData*>((*mdp.get())) будет разыгрывать MyData в Mydata *, const_cast<MyData*>(mdp.get()) будет хорошим ...

...