簡體   English   中英

將所有成員從一個結構復制到另一個結構

[英]Copy all members from a struct to another struct

在C ++中,我有兩個結構(假定所有成員都是公共的):

struct A{
   t1 d1;
   t2 d2;
   t3 d3;
   ...
   t100 d100;
};

struct B{
   t7 d7;
   t3 d3;
   t5 d5;
};

B中的成員是A成員的子集。

現在,我需要一個函數將所有成員從B復制到A:

func(A a, B b) {
    a.d7 = b.d7;
    a.d3 = b.d3;
    a.d5 = b.d5;
}

在不顯式列出所有B成員的情況下,實現func的優雅方法是什么? 給定A是固定的,不能修改。

如果允許您更改A,則可以表示A和B之間的結構關系:

  • A可以從B繼承,如果A實際上是B的一種。則可以從A刪除公共元素(因為它們是從B繼承的)。

  • A可以讓B成員替換常見元素。

在這種情況下,您可能會喜歡使用= (在第一種情況下,您將有意使用切片,在第二種情況下,這將是干凈的分配)。

如果您無法表達結構關系,則沒有通用的安全方法,但可以像列出的那樣分配工作。

您不應該考慮使用memcopy()方法或類似方法,因為不能確保元素具有相同的對齊方式。 如果它不是POD元素,則可能導致未定義的行為(內存泄漏,損壞,虛擬功能表損壞等)。

您給出的示例:

func(A a, B b) {
    a.d7 = b.d7;
    a.d3 = b.d3;
    a.d5 = b.d5;
}

看起來是宏的好地方:

func(A a, B b) {
#define c(f) a.f = b.f
    c(d7);
    c(d3);
    c(d5);
#undef c
}

在不顯式列出所有B成員的情況下,實現func的優雅方法是什么?

在您的情況下,沒有其他方法。

如果您使用的是C ++並且struct A是可修改的,那么您可以使用class並利用復制構造函數已經存在的優雅功能:

class_name (const class_name & class_object)

和副本分配:

class_name & class_name::operator= (const class_name & class_object)

以下是復制構造函數復制分配的鏈接,供您進一步閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM