2009-11-06 13 views
24

jak mogę powiedzieć STL, specjalnie dla metody resize() w wektorze, aby zainicjować obiekty z konstruktorem innym niż domyślny, iz jakimi parametrami?wektor stl i C++: jak .resize bez domyślnego konstruktora?

Znaczy:

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

std::vector<something> many_things; 

many_things.resize (20); 

bardziej ogólnie, w jaki sposób mogę zmusić do korzystania z mojego STL Costructor gdy potrzebuje do tworzenia obiektów i przekazać parametry do tego konstruktora?

w moim przypadku dodanie domyślnego konstruktora nie jest opcją i wolałbym nie używać tablicy wskaźników do rozwiązania problemu.

Odpowiedz

43

Użyj przeciążenia 2-argument: many_things.resize(20, something(5));

0

Można użyć reserve(), aby zwiększyć rozmiar bufora i ręcznie dodać (push_back()) potrzebne elementy w pętli.

+1

Następnie masz jawnie zakodowaną na stałe pętlę zamiast niejawnego używanego przez 'resize'. –

0

ze specjalizacją podobni to (przepraszam, napisałem to tylko minimalnego poziomu kontroli)?

#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; 
} 

Ale pomyśl, czy naprawdę tego potrzebujesz. Dlaczego nie utworzyć domyślnego konstruktora?

1

Potrafię wymyślić rozwiązanie, ale muszę ci powiedzieć, że jest dość brzydki. Nie wiem, dlaczego nie chcesz dodawać domyślnego konstruktora, ale jeśli chcesz tylko uniemożliwić użytkownikom klasy tworzenie niezainicjowanych instancji, możesz po prostu ustawić domyślny konstruktor jako prywatny i zadeklarować odpowiednią klasę wektorową jako przyjaciela:

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

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

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

Jest to brzydkie z kilku powodów, głównie dlatego, że działa tylko dla jednego typu kontenera. Nie ma innego sposobu, ponieważ kontenery STL wymagają po prostu, aby ich elementy były domyślnie skonstruowane.

+2

Odkryłem, że to nie działa, ponieważ 'std :: vector ' deleguje budowę do innej klasy, więc przyjaźń staje się bezużyteczna. Zobacz [tutaj] (http://stackoverflow.com/questions/2907432/c-friend-class-stdvector) –

+0

Dzięki za aktualizację! Myślę, że to, co dostajesz w zależności od szczegółów implementacji. _3,5-lat temu nie był tak doświadczony :) –

+0

żyj i ucz się;) –

Powiązane problemy