好吧,不太确定如何表达这个问题,也找不到任何我认为真正解决这种情况的重复项。
本质上,我有一个父类(super class),它通过子类向其附加额外的数据。该数据的容器类仅识别父类(super class),并根据父类(super class)中的 id 参数调整特性。
实际上,直到最近我才不得不在 C++ 中使用继承,所以如果这是微不足道的,请原谅我。我的印象是,当我使用父类(super class)硬复制一堆数据时,子类数据可以说在翻译中丢失了。为了绕过这个限制,我尝试使用类型转换的指针,但是现在,即使在 free() 函数中类型转换指针参数时,尝试释放内存时也会出现段错误。
这是示例代码...
结构体
// Super class
struct Vertex {
__declspec(align(4)) unsigned int vType; // Identifies the vertex type.
Vertex(const unsigned int _vType) : vType(_vType) { }
Vertex(const Vertex &_rV) : vType(_rV.vType) { } // Copy constructor
virtual ~Vertex() { }
unsigned int GetVType() const { return vType; }
};
// Subclass
// Id = 1
struct V_Pos : Vertex {
__declspec(align(4)) XMFLOAT3 position;
V_Pos(void) : Vertex(1) { }
V_Pos(XMFLOAT3 &_rPosition) : Vertex(1), position(_rPosition) { }
V_Pos(const V_Pos &_rV) : Vertex(_rV), position(_rV.GetPosition()) { } // Copy constructor
~V_Pos() { }
XMFLOAT3 GetPosition() const { return position; }
};
以下是我当前复制数据的方式。
// pBuffer is declared as a Vertex* data type
pBuffer = new V_Pos[_bufSize];
if (_pVBuffer->GetVType() == 1)
for (unsigned int i = 0; i < bufSize; ++i) {
V_Pos *_temp = (V_Pos*)&_pVBuffer[i];
pBuffer[i] = *_temp;
}
以下是我目前解除数据分配的方式。
if (pBuffer != 0) {
delete [] pBuffer;
pBuffer = 0;
}
针对这种情况,正确的做法是什么?
编辑 1 -
更新了上述代码块以澄清 knulp 答案下的评论讨论。
最佳答案
如果你开始将低级内存分配与 malloc()/free() 和 C++ 对象混合在一起,你会遇到很多麻烦,同时使你的代码几乎不可读。
您应该在适当的构造函数上使用 new 创建一个新对象,它会自动 1) 分配内存并 2) 初始化结构。要正确释放内存,您应该使用删除和析构函数。
您应该使用复制构造函数和赋值运算符进行复制。如果您没有定义它们,编译器会自动定义默认值来执行按位复制。
为什么要使用类型字段? C++ 具有非常强大的类型功能,因此绕过所有 C++ 机制来定义 vType 意义不大。相反,定义一个基类,以及两个或多个从中派生的类,然后消除 vtype 字段。
如果您使用干净的面向对象编程,您将从一开始就避免所有这些问题。
关于C++ 继承以及如何通过父类(super class)传递和维护子类数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6684630/