簡體   English   中英

如何在c / c ++中復制結構?

[英]How to copy structure in c/c++?

DECLARE_PTR(VIDEOINFOHEADER, pvi, pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER)));
ZeroMemory(pvi, sizeof(VIDEOINFOHEADER));

//initialize Vih
VIDEOINFOHEADER Vih;
Vih.aaa = xxx;
Vih.bbb = yyy;
...
//now how to copy the value of Vih to pvi?

有誰知道?

您應該能夠進行簡單的分配:

*pvi = Vih;

如果類設計者正確地完成了工作,那么這將確保值的可用副本(調用賦值運算符-還應該有一個副本構造函數和一個可能不平凡的析構函數)。 如果班級設計者不勝其煩,請獲得更好的班級庫(或教育班級設計者)。

您對Vih零星初始化表明可能存在類設計問題。 構造函數用於初始化類,如果該類具有許多公共可見的組件,則可能有很多隱患。

您可能還應該使用new來分配pvi ,從而在那里分配一個構造函數; 您幾乎應該確定不會使用ZeroMemory()改變新分配的變量。 您的語言標簽是“ C ++”; 該代碼建議(不是很好地編寫)C思維-不是C ++思維。

如果您是班級設計師,則需要復習班級設計的一些基礎知識。


可以通過分配復制哪些類?

可以通過分配復制兩組類,而不必擔心。

  1. 包含簡單非指針數據元素的類-POD或“普通舊數據”類。 這些類可以使用編譯器精心設計的賦值運算符。 但是,一旦有了指點,就必須開始擔心。 但是,如果類具有(非POD)成員,且這些成員具有有效的賦值運算符,則您仍可以使用編譯器精心設計的默認賦值運算符。

  2. 具有精心設計的賦值運算符的類。 在這里,類設計者處理所有與復制數據,復制分配的內存或使用引用計數和寫時復制(CoW)技術有關的問題,以最大程度地減少工作量。 這樣的類還具有精心設計的副本構造函數-幾乎總是一個析構函數。 這些類旨在簡化分配和將值傳遞給函數等的過程。

包含指針而沒有顯式賦值運算符(以及復制構造函數和析構函數)的類必須根據其優點進行檢查。 有時,可以復制此類。 通常情況並非如此。

您正在使用C ++的Windows API。 這是可能的,但是您需要了解您將面臨的細微風險。

許多Windows API使用簡單的結構,這也不例外。 VIDEOINFOHEADER結構只是簡單成員的序列。 您不需要困難的語法。 以下代碼更加清晰:

  VIDEOINFOHEADER *pvi = pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
  // Equivalent to
  // DECLARE_PTR(VIDEOINFOHEADER, pvi, pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER)));
  ZeroMemory(pvi, sizeof(VIDEOINFOHEADER));

  pvi->rcSource.left = 5; // etcetera. You can directly assign to pvi->

在C ++中,您可以簡單地將一個結構分配給另一個:

*pvi = Vih;

在C語言中,您將使用memcpy

memcpy(pvi,&Vih,sizeof(VIDEOINFOHEADER));

在您的特定情況下,為什么要初始化中間Vih對象?

清除並分配pvi指針后,就可以

pvi->aaa = xxx;
pvi->bbb = yyy; 
...

等等,以初始化videoinfoheader。 如果該->語法繁重,則可以創建對指向數據的臨時引用:

DECLARE_PTR(VIDEOINFOHEADER, pvi, pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER)));
ZeroMemory(pvi, sizeof(VIDEOINFOHEADER));

//initialize pvi, using a temporary reference that allows the convenient . notation
VIDEOINFOHEADER& Vih = *pvi;
Vih.aaa = xxx;
Vih.bbb = yyy;
...
// pvi is now initialized as pvi and Vih are both referencing the same memory, just
// using different syntaxes.

暫無
暫無

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

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