當你無法修改現有的結構定義時,你所要求的是不可能的。但是,您仍然可以通過一些OO風格的編程來自動執行功能。以下所有內容假定結構中的數據字段長度相同,並且包含相同大小的元素,如示例中所示。
基本上,你用自己的容器包裝現有的結構。你可以把這個頭文件:
/* Forward declaration of the wrapper type */
typedef struct s_wrapperStruct wrapperStruct;
/* Function pointer type for an updater function */
typedef void (*STRUCT_UPDATE_FPTR)(wrapperStruct* w, aStruct* src);
/* Definition of the wrapper type */
struct s_wrapperStruct
{
STRUCT_UPDATE_FPTR update;
aStruct* ap;
bStruct* bp;
};
然後你就可以可以創建你用它來創建您的同步結構對避免同步邏輯暴露給感興趣各方工廠式的模塊。實現一些簡單的功能。
/* The updater function */
static void updateStructs(wrapperStruct* w, aStruct* src)
{
if ((w != NULL) && (src != NULL))
{
/* Copy the source data to your aStruct (or just the data field) */
memcpy(w->ap, src, sizeof(aStruct));
/* Sync a's data field to b */
sync(w); /* Keep this as a separate function so you can make it optional */
}
}
/* Sync the data fields of the two separate structs */
static void sync(wrapperStruct* w)
{
if (w != NULL)
{
memcpy(w->bp->data, w->ap->data, sizeof(w->bp->data));
}
}
然後在你的工廠函數可以創建包裹對。
/* Create a wrapper */
wrapperStruct syncedPair = { &updateStructs, &someA, &someB };
然後,您可以在需要的地方通過,例如,正在更新您的aStruct
,並使用它像這樣的過程:
/* Pass new data to the synced pair */
syncedPair.update(&syncedPair, &newDataSource);
因爲C不是被設計成一個面向對象的語言,它不具有this
指針,你需要通過明確的包裝圍繞指針。從本質上講,這就是C++幕後的情況,編譯器爲您節省了額外的麻煩。
如果您需要將單個aStruct
同步到多個bStruct
s,將指針更改爲數組指針並相應地修改其餘部分應該非常簡單。
這可能看起來像一個過於複雜的解決方案,但是當您實現邏輯一次時,它可能會幫助您節省維護中的一些體力勞動。
那不是這是如何工作的。分配'a.data [0] =(char)b.data [0]'等等。如果你喜歡,可以使用for循環。 – Magisch
在'bStruct'中,您需要將'char data [8]'更改爲'char * data',所以答案是否定的。 – user3386109
數組不指向數據。並且不可分配。查看如何複製數組,應該有許多重複項。 – juanchopanza