2013-01-01 6 views
3

템플릿 클래스를 만들 때 무슨 일이 일어나고 있는지 다소 당황 스럽습니다. 저는 건설 중에 vector_ 구성원의 용량을 50으로 설정하려고합니다. 그러나 용량이 제대로 설정되지 않았으므로 분명히 어떻게 처리되는지 이해할 수 없습니다. 콘솔 출력뿐만 아니라 관련 코드 스 니펫도 포함 시켰습니다. 도와 줘서 고마워! 벡터C++ 초기화 템플릿 클래스

템플릿 클래스 :이 초기화 R의

template <typename T> 
class V 
{ 
    public: 
    V() 
    { 
     std::cout << "capacity 1 = " << this->vector_.capacity() << "\n"; 
    }; 
    V(int capacity) 
    { 
     this->vector_.reserve(capacity); 
     std::cout << "capacity 2 = " << this->vector_.capacity() << "\n"; 
    }; 
    int capacity() const { return this->vector_.capacity(); }; 
    private: 
    std::vector<T> vector_; 
}; 

생성자 : R 클래스의

R::R() 
{ 
    std::cout << "capacity 0 = " << this->s_.capacity() << "\n"; 
    this->s_ = V< std::vector< std::complex<float> > >(50); 
    std::cout << "capacity 3 = " << this->s_.capacity() << "\n"; 
}; 

헤더 :

class R 
{ 
    public: 
    R(); 
    private: 
    V< std::vector< std::complex<float> > > s_; 
}; 

출력 콘솔 :

capacity 1 = 0 
capacity 0 = 0 
capacity 2 = 50 
capacity 3 = 0 
+0

아마도 _copy-constructor_이 누락 되었습니까? 출력을 생성하는 코드는 무엇입니까? –

+0

어떻게 컴파일하나요? 's_'는'V' 타입이고,'capacity' 메소드를 가지고 있지 않습니다 ... –

+0

또한 클래스 V에 대한 참조를 반환합니다. 생성자가 당신의 쓰레기를 혼란스럽게합니다. – johnathon

답변

4

std::vector<T>의 크기는 설정하지 않지만 용량은 설정하지 마십시오. 용량은 std::vector<T>의 주요 특성이 아니므로 복사되지 않습니다. 크기를 설정하려면 resize()을 사용해야합니다.

+0

복사 생성자를 사용해야하기 때문에 용량을 올바르게 설정하는 방법은 무엇입니까? 또는 한 번만 인스턴스화하고 싶기 때문에 하나의 생성자를 사용하는 또 다른 방법이 있습니다. 그러나 R의 생성자에서 ... – wrapperapps

+1

@wrapperapps : 복사 생성자 (및 개체를 할당하는 경우 copy assigment)를 제공해야합니다. 'capacity()'를 복사합니다. 0이 아닌 용량을 설정하더라도 벡터의 크기는 변하지 않습니다. 즉 비어 있지만 메모리를 할당합니다. –

+0

감사합니다. 추가로 작동하도록했습니다. V & operator = (V const & copy) { this-> vector_ = copy.vector_; this-> vector_.reserve (copy.vector_.capacity()); return * this; }; – wrapperapps