Элементы QT в векторной инициализации. Как решить проблему конструктора частного копирования? - PullRequest
0 голосов
/ 25 ноября 2010

Я хотел создать вектор подкласса QGraphicsRectItem с именем MyRect. Этот вектор инициализируется в MyClass:

MyClass::MyClass () : myVector_(80, std::vector<MyRect>(60, MyRect(true,true)))
...

Я узнал, что vector создает первый элемент, а затем копирует его с помощью конструктора копирования. Проблема в том, что конструктор копирования QGraphicsRectItem является закрытым, и это не работает. (Очень длинное сообщение об ошибке, один час поиска в Google)

Теперь у меня есть три возможных решения:

1.) Создайте цикл for и заполните myVector самостоятельно в теле конструктора.

1b.) Просто используйте обычный массив, потому что он все равно остается статическим.

2.) Используйте MyRect * вместо MyRect в качестве содержимого myVector (ручное распределение памяти -> плохое)

3.) Используйте QVector, который использует Object * по умолчанию и управляет памятью для меня.

Потратив хотя бы один час на решение этой проблемы, я хотел бы услышать от вас, есть ли другие хорошие возможности или что вы думаете, лучшее решение . Я на грани отбрасывания векторов для этого и просто использую массивы.

1 Ответ

2 голосов
/ 25 ноября 2010

Вектор, как вы объявили, должен будет манипулировать экземплярами MyRect.Это означает, что в зависимости от того, что вы делаете с элементами вектора, или если вы копируете вектор, экземпляры MyRect могут дублироваться.

Это невозможно, поскольку это будет означать создание новогоitem каждый раз, когда происходит копирование (вот почему конструктор QGraphicsItem является закрытым).Вы должны манипулировать элементами вашей сцены с помощью указателя.

Таким образом, для меня лучшее решение - хранить в ваших векторных указателях ваши элементы (ваше второе решение):

std::vector<MyRect*>

Управление памятью вообще не должно быть проблемой, поскольку это будет обрабатываться Qt: когда вы уничтожаете сцену, все элементы этой сцены будут уничтожены.

Ваш векторне будет дублировать предметы (без инстанцирования), только указатели, что означает, что вы не будете создавать новые предметы, которые вам придется уничтожать сами.

...