2009-11-06 2 views
24

어떻게 STL, 특히 벡터의 resize() 메서드에 대해 기본 생성자와 함께 개체를 초기화하고 매개 변수를 사용하여 개체를 초기화 할 수 있습니까?stl vector 및 C++ : 기본 생성자없이 .resize하는 방법?

는 말 : 더 일반적으로

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

std::vector<something> many_things; 

many_things.resize (20); 

, 어떻게 그것이 개체를 만들 필요가있을 때 내 costructor를 사용하는 STL을 강제하고, 그 생성자에 매개 변수를 전달할 수 있을까?

제 경우에는 기본 생성자를 추가하는 것이 옵션이 아니며 포인터 배열을 사용하지 않는 것이 좋습니다.

답변

43

은 2 인자 과부하를 사용?

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

하지만 실제로 필요하면 생각해보십시오. 대신 기본 생성자를 만들지 않으시겠습니까?

0

reserve()을 사용하여 버퍼 크기를 늘리고 필요한 항목을 루프에 수동으로 추가 할 수 있습니다 (push_back()). 전문화와 many_things.resize(20, something(5));

+1

그러면'resize'가 사용하는 암시 적 루프 대신 명시 적으로 하드 코딩 된 루프가 생깁니다. –

0

이 모두이 (미안, 난 단지 최소한의 검사로 쓴) :

1

나는 해결책을 생각할 수 있지만 너를 보니 오히려 추악하다. 왜 기본 생성자를 추가하고 싶지는 모르겠지만 클래스의 사용자가 초기화되지 않은 인스턴스를 만들지 않도록하려면 기본 생성자를 private으로 만들고 해당 벡터 클래스를 친구로 선언하면됩니다.

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

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

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

이것은 하나의 컨테이너 유형에서만 작동하기 때문에 여러 가지 이유로 추악합니다. 다른 방법은 없습니다. 왜냐하면 STL 컨테이너는 단순히 항목을 기본 구성 가능하도록 요구하기 때문입니다.

+2

'std :: vector '이 다른 클래스에 구성을 위임했기 때문에 이것이 작동하지 않는다는 것을 알았습니다. 그래서 우정은 쓸모 없게됩니다. 참조 [여기] (http://stackoverflow.com/questions/2907432/c-friend-class-stdvector) –

+0

업데이트 주셔서 감사합니다! 내 생각에 구현 세부 사항에 따라 얻을 수있는 것. _3.5-years-ago-me_는 경험이 없었습니다 :) –

+0

live and learn;) –