2014-06-19 3 views
0

J'essaie d'utiliser un QVector avec un objet personnalisé nommé RoutineItem.QVecteur avec des objets personnalisés qui ont des arguments?

Mais cette erreur est donnée:

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

C'est le constructeur RoutineItem:

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

Si je supprime tous les arguments du constructeur, je ne reçois cette erreur. Comment puis-je utiliser QVector avec un objet personnalisé avec des arguments?

+3

Comme pour les conteneurs standard, vous devez fournir un type constructible par défaut pour QVector. –

+0

@ πάνταῥεῖ Les conteneurs standard C++ 11 ne nécessitent pas d'éléments constructibles par défaut. Les emplacements requis sur les éléments sont spécifiques à la façon dont vous utilisez le conteneur. Par exemple, 'std :: list' ne nécessite même pas d'éléments constructibles de copie si vous pouvez vous en tenir aux méthodes' emplace_' au lieu de 'push_'. –

Répondre

5

Le problème est que QVector requiert que l'élément ait un constructeur par défaut (c'est le message d'erreur à propos de). Vous pouvez en définir un dans votre classe. Par exemple:

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

Alternativement, vous pouvez laisser tous les arguments ont une valeur par défaut:

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

Vous pouvez construire une valeur par défaut de RoutineItem et initialiser tous les éléments vectoriels par celui-ci:

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

Fournir les arguments non par défaut dans QVector constructor

Exemple: suivant crée 10 RoutineItem éléments avec la même Name, Position, Time

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

Si vous êtes prêt à utiliser C++ 11 et std::vector, il n'y a plus besoin de défaut-constructibilité:

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

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

Ce code ne fonctionnera pas en pré-C++ 11, et il ne fonctionnera pas avec QVector.

Questions connexes