gpt4 book ai didi

c++ - 如何在c/c++中复制结构?

转载 作者:行者123 更新时间:2023-11-28 03:55:53 24 4
gpt4 key购买 nike

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++ - 如何在c/c++中复制结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3654928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com