2009-11-06 7 views
24

Comment pourrais-je dire à STL, spécifiquement pour la méthode resize() dans vector, d'initialiser des objets avec un constructeur autre que par défaut, et avec quels paramètres?stl vecteur et C++: comment .resize sans un constructeur par défaut?

Je veux dire:

class something { 
    int a; 
    something (int value); 
} 

std::vector<something> many_things; 

many_things.resize (20); 

plus généralement, comment pourrais-je forcer STL à utiliser mon costructor quand il a besoin de créer des objets et passer des paramètres à ce constructeur? Dans mon cas, l'ajout d'un constructeur par défaut n'est pas une option, et je préférerais ne pas utiliser un tableau de pointeurs pour résoudre le problème.

Répondre

43

Utilisez la surcharge 2 argument: aussi bien ce (désolé, j'ai écrit cela avec seulement un contrôle minimal) Avec la spécialisation many_things.resize(20, something(5));

0

Vous pouvez utiliser reserve() pour augmenter la taille du tampon et ajouter manuellement (push_back()) les éléments nécessaires dans une boucle.

+1

Vous avez alors une boucle explicite codée en dur au lieu de l'implicite utilisé par 'resize'. –

0

?

#include <vector> 

class MyClass 
{ 
    private: 
     MyClass(); 
    public: 
     MyClass(unsigned i) : _data(i) {}; 

    private: 
     unsigned _data; 
}; 

typedef std::vector<MyClass> MyVector; 

void MyVector::resize(MyVector::size_type new_size) 
{ 
    this->resize(new_size, MyClass(5)); 
} 

int main() 
{ 
    MyVector vector; 
    vector.resize(5); 

    return 0; 
} 

Mais pensez si vous en avez vraiment besoin. Pourquoi ne pas créer un constructeur par défaut à la place?

1

Je peux penser à une solution, mais iwarn vous, c'est plutôt moche. Je ne sais pas pourquoi vous ne voulez pas ajouter de constructeur par défaut, mais si vous voulez empêcher les utilisateurs de la classe de créer des instances non initialisées, vous pouvez juste rendre le constructeur par défaut privé et déclarer la classe de vecteurs appropriée comme ami:

class Foo { 
public: 
    Foo(int x) : num(x) {} 

    int GetX() { return num; } 
private: 
    friend class std::vector<Foo>; 

    int num; 
    Foo() : num(10) {} 
}; 

Ceci est moche pour plusieurs raisons, principalement parce qu'il ne fonctionne que pour un type de conteneur. Il n'y a pas d'autre moyen, car les conteneurs STL nécessitent simplement que leurs objets soient constructibles par défaut.

+2

J'ai trouvé que cela ne fonctionne pas parce que 'std :: vector ' délègue la construction à une autre classe et donc l'amitié devient inutile. Voir [ici] (http://stackoverflow.com/questions/2907432/c-friend-class-stdvector) –

+0

Merci pour la mise à jour! Je suppose que c'est ce que vous obtenez en fonction des détails de mise en œuvre. _3.5-années-ago-moi_ n'était pas aussi expérimenté :) –

+0

vivre et apprendre;) –