2014-06-19 3 views
0

Я пытаюсь использовать QVector с пользовательским объектом с именем RoutineItem.QVector с пользовательскими объектами, которые имеют аргументы?

Но эта ошибка Дано:

C:\Qt\5.2.1\mingw48_32\include\QtCore\qvector.h:265: error: no matching function for call to 'RoutineItem::RoutineItem()' 

Это конструктор RoutineItem:

RoutineItem(QString Name,int Position,int Time,bool hasCountdown = false,bool fastNext = false); 

Если удалить все аргументы конструктора я больше не получаю эту ошибку. Как использовать QVector с пользовательским объектом с аргументами?

+3

Как и в случае со стандартными контейнерами, для QVector необходимо создать конструкцию по умолчанию. –

+0

@ πάνταῥεῖ Стандартные контейнеры C++ 11 не требуют конструктивных элементов по умолчанию. Требования к предметам относятся к тому, как вы используете контейнер. Например, 'std :: list' даже не требует элементов, пригодных для копирования, если вы можете придерживаться' emplace_' вместо методов 'push_'. –

ответ

5

Проблема в том, что QVector требует, чтобы элемент имел конструктор по умолчанию (то есть сообщение об ошибке). Вы можете определить его в своем классе. Например:

class RoutineItem { 
    RoutineItem(QString Name, int Position, 
       int Time, bool hasCountdown = false, 
       bool fastNext = false); 
    RoutineItem(); 
    [..] 
}; 

В качестве альтернативы, вы можете позволить все аргументы имеют значения по умолчанию:

class RoutineItem { 
    RoutineItem(QString Name = QString(), int Position = 0, 
       int Time = 0, bool hasCountdown = false, 
       bool fastNext = false); 
    [..] 
}; 

В качестве альтернативы, вы можете построить значение по умолчанию RoutineItem и инициализировать все векторные элементы им:

RoutineItem item("Item", 0, 0); 
// Create a vector of 10 elements and initialize them with `item` value 
QVector<RoutineItem> vector(10, item); 
2

Предоставлять аргументы не по умолчанию в QVector constructor

Пример: Следующий создает 10 RoutineItem элементов с одинаковыми Name, Position, Time

QVector<RoutineItem> foo(10, RoutineItem("name", 123, 100)); 
              ^ ^ ^
              |  |  | 
              +-----+-----+-----Provide arguments 
1

Если вы готовы использовать C++ 11 и std::vector, там больше нет требования по умолчанию-конструктивность:

void test() 
{ 
    class C { 
    public: 
     explicit C(int) {} 
    }; 

    std::vector<C> v; 
    v.push_back(C(1)); 
    v.push_back(C(2)); 
} 

Этот код не будет работать с pre-C++ 11, и он не будет работать с QVector.