2013-10-01 3 views
1

Я хочу скопировать две аналогичные структуры в C++. Рассмотрим ниже три структуры.Скопируйте две аналогичные структуры в C++

struct Dest_Bio 
{ 
     int age; 
     char name; 
}; 

struct Source_Bio 
{ 
     int age; 
     char name; 
}; 

struct Details 
{ 
     int id; 
     Dest_Bio* st_bio; //Needs to be populated with values from Source_Bio 
}; 
  • У меня есть ценности, заполненные в структуре «Source_Bio»
  • Я хочу, чтобы скопировать эти значения в Source_Bio в st_bio в структуре «Подробности».
  • Я не хочу, чтобы создать элемент для Dest_Bio

Я попробовал следующее. Он компилируется отлично, но сбой программы во время выполнения.

Source_Bio st_ob; 
st_ob.age = 5; 
st_ob.name = 't';  
Details st_a; 
st_a.id = 1; 
st_a.st_bio = (Dest_Bio*) malloc(sizeof(Dest_Bio)); 
memcpy((struct Dest_Bio*)&st_a.st_bio, (struct Source_Bio*)&st_ob,sizeof(Dest_Bio)); 

Как это сделать? Заранее спасибо

+2

Ваш 'memcpy' относится к адресу' st_a.st_bio', но это уже указатель. Выньте '&'. –

+0

Это то, с чем я ежедневно работаю на большой базе исходных кодов C, из которой генерируются несколько приложений. И это постоянный источник проблем с изменениями и обновлениями. Это похоже на измельченный пример, из которого, по-видимому, нет причин, почему вы хотите сгибать C++ в C, поэтому мне интересно, почему вы это делаете. –

+0

Вместо 'Source_Bio' и' Dest_Bio' вы должны, вероятно, просто «Bio», и является ли экземпляр класса источником или dest контекстуальным на основе вашего кода. – David

ответ

3

простой способ, вероятно, будет что-то вроде этого:

struct Dest_Bio { 
    int age; 
    char name; // should this really be a string instead of a single char? 

    Dest_Bio(Source_Bio const &s) : age(s.age), name(s.name) {} 
}; 

Details st_a; 

st_a.id = 1; 
st_a.st_bio = new Dest_Bio(st_ob); 

еще лучше, вы, вероятно, следует просто ликвидировать Dest_Bio и Source_Bio и заменить как только с Bio и сделать с ней. Вы также почти наверняка хотите заменить свой Dest_Bio *st_bio на какой-то умный указатель - необработанный указатель в значительной степени просит неприятностей. В качестве альтернативы просто вставьте объект Bio внутри объекта Details (вероятно, предпочтительный вариант).

1

Поскольку у вас уже есть требование, чтобы типы Bio были совместимы с макетами, сделайте общий тип Bio. Затем сделайте копию в C++, а не C:

st_a.st_bio = new Bio(st_ob); 

Если они должны быть разных типов, то вы можете сделать Source_Bio конвертируемые в Dest_Bio через оператора конструктора или преобразования.

Это предполагает, что у вас есть истинная причина для вашего третьего требования (это скорее указатель, чем член). В противном случае, сделать его членом, фиксируя потенциальную утечку памяти и упростить код дальше:

st_a.st_bio = st_ob; 

Если вы действительно хотите, чтобы слоняться вокруг с функциями C, то вы хотите скопировать st_a.st_bio, не &st_a.st_bio (т.е. перезапись объекта, а не указатель на него). Только делайте это, если ненавидите того, кто будет поддерживать код.

Смежные вопросы