我想创建一个名为MyRect的QGraphicsRectItem子类的向量。此向量在MyClass中初始化:
MyClass::MyClass () : myVector_(80, std::vector<MyRect>(60, MyRect(true,true)))
...
我了解到vector构造了第一个元素,然后使用复制构造函数复制它。问题是QGraphicsRectItem的拷贝构造函数是私有的,这不起作用。 (很长的错误信息,一小时的谷歌搜索)
现在我有三种可能的解决方案:
1.)创建一个for循环并在构造函数体中自己填充myVector。
1b。)只需使用常规数组,因为它仍然是静态的。
2.)使用MyRect *代替MyRect作为myVector的内容(手动内存分配 - >坏)
3.)使用默认使用Object *的QVector并为我管理内存。
在花了至少一个小时来解决这个问题后,我想听听你是否有其他好的可能性或者你认为最佳解决方案。我正在为此删除向量并只使用数组。
答案 0 :(得分:2)
您声明的向量必须操纵MyRect
的实例。这意味着,根据您对向量元素的处理方式,或者如果复制向量,MyRect
实例可能会重复。
这是不可能的,因为这意味着每次复制时都会创建一个新项目(这就是QGraphicsItem构造函数是私有的原因)。您必须通过指针操纵场景中的项目。
因此,对我而言,最好的解决方案是在商品的矢量指针中存储(第二个解决方案):
std::vector<MyRect*>
内存管理应该不是问题,因为这将由Qt处理:当你破坏场景时,这个场景的所有项目都将被销毁。
你的矢量不会重复项目(没有实例),只会指针,这意味着你不会创建你必须自己销毁的新项目。