我已经编写了一个表示元素缓冲区的模板化类。现在,我必须在这个缓冲区中插入2D顶点(这很简单,也很容易)。现在我想创建一个缓冲区,表示线段,顶点基于2D缓冲区顶点。例如,在我的"顶点缓冲区"中,我插入了2个顶点。然后我创建一个"线段缓冲区",并插入一个线段。该线段末端由"顶点缓冲区"中的2个顶点表示。现在,如果我更改"顶点缓冲区"中一个顶点的坐标,线段坐标也必须更改。它是等级结构之王。2D顶点<=线段<=三角形
Mu缓冲类看起来像:
template <class T>
class Buffer
{
public:
Buffer(Buffer& buffer);
Buffer(size_t initialBufferSize = 1);
~Buffer();
Buffer& operator=(const Buffer& buffer);
T& Buffer::operator[](const int nIndex);
void insertElement(T element);
void deleteElement(size_t index);
size_t count();
private:
T* elements_;
size_t elementsCount_;
size_t bufferSize_;
void resizeBuffer(size_t newBufferSize);
};
deleteElement方法:
template <class T>
void Buffer<T>::deleteElement(size_t index)
{
if (index >= elementsCount_)
throw "No element at specified index";
if (elementsCount_-index-1 > 0)
memcpy(elements_+index, elements_+index+1, (elementsCount_-index-1)*sizeof(T));
elementsCount_--;
}
问题是当我从"顶点缓冲区"中删除一个顶点时。线段指向已删除顶点的指针将无效。我该如何处理这种情况?
基本上,我有一个顶点缓冲区,并希望根据我得到的顶点创建线段和三角形。
PS:线段结构看起来像这样:
struct LineSegment {
Buffer<Vertex>* buffer;
size_t indexOfVertexA, indexOfVertexB;
//Now if I want to access the lineSegment vertices, I use **lineSegment.buffer[indexOfVertexA]**
}
您应该查看std::shared_ptr:http://www.cplusplus.com/reference/memory/shared_ptr/
您应该使用数据结构方便地组织删除。
删除顶点-->涉及哪些线段-->哪些三角形。并删除所有引用