2016-05-31 7 views
0

это мой первый вопрос на этом веб-сайте, но я постараюсь охватить все, что необходимо. Извиняюсь, если я что-то забыл. Я столкнулся с проблемой с помощью QT Creator, но я полагаю, что это будет то же самое с использованием Visual Studio или просто C++ вообще.Добавление объекта в вектор

У меня есть несколько классов: Mainwindow, Track и AddForm. Mainwindow - это то, что он называется. Основная форма. Трек - это пользовательский класс, основанный на QObject, который содержит только одну переменную QString (только сейчас, так как я все еще экспериментирую с QT). А AddForm - это класс для другой формы, которую можно создать, нажав кнопку в моей форме MainWindow. Эта форма содержит только однострочное редактирование для заполнения строки и кнопки с надписью «Добавить». Всякий раз, когда эта кнопка нажата, текст из редактирования строки будет помещен в переменную QString из класса Track. Эта переменная QString называется «художник».

Помимо назначения текста из строки-редактирования переменной «artist» для объекта Track, форма также будет выдавать сигнал, который отправляет этот весь объект. Слот в моем главном окне будет реагировать на этот сигнал и собирать Трек-объект. Все идет нормально.

Вот мой вопрос. В моем заголовке mainwindow я создал приватный QVector с именем trackVector, который затем могу вызвать в моем mainwindow.cpp. То, что я хочу сделать, это append/push_back QVector с этим объектом Track. Вроде как это:

trackVector.push_back(trackObject); 

Я получаю следующее сообщение об ошибке при создании приложения: click here for a screenshot

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

QVector<int> myVector; 
myVector.push_back(3); 

Я думаю, что всякий раз, когда вы добавляете в QVector (или стандартный без интервала QT вектор), вы должны сделать это с помощью конструктора этого класса. Но как я могу создать конструктор, в который вы можете просто поместить уже существующий объект?

Пожалуйста, объясните как можно более простые слова, так как я не являюсь носителем английского языка :) Большое спасибо!

+0

Ошибка говорит о том, что вы пытаетесь нажимать * указатель * на объект 'Track', когда вектор является вектором объектов' Track' * * (не указателей). –

+0

спасибо! Поэтому вы думаете, что он будет работать, когда это не указатель. Вы знаете, как сделать это не указателем, так сказать? – MartijnKor

+0

Либо не передайте указатель на функцию 'trackAdded', либо разыщите указатель. –

ответ

1

Вы отправили недостаточно кода (поэтому ваше сообщение может быть закрыто как вне темы - классическая ошибка начинающих на SO), но я думаю, что подходящее решение здесь - использовать некоторый тип автоматического указателя. Если ваш TrackVector является сохранение права собственности на Track объектов, то лучшим решением будет иметь std::unique_ptr<Track> элементы:

std::vector<std::unique_ptr<Track>> TrackVector; 
// filled like 
TrackVector.emplace_back(new Track(args)); 

Если, с другой стороны собственности рука лежит где-то еще, вы можете использовать либо std::shared_ptr или даже сырые указатели (при условии, ваш макет гарантирует, что время жизни объектов, указывающих на Track, превышает срок службы TrackVector).