2013-05-11 2 views
1

왜 작동하지 다음을 수행합니다범위 지정 문제 클래스 생성자 체인 때 생성자 체인 때

#include <iostream> 
#include <vector> 

class cls { 
public: 
    cls()   {cls(5);}  // want to resize v to 5 
    cls(int n)  {v.resize(n);} 
    std::vector<int> v; 
}; 

int main(int argc, const char* argv[]) { 
    cls x, y(5); 
    std::cout << x.v.size() << std::endl; // prints 0 <- expected 5 
    std::cout << y.v.size();    // prints 5 
    return 0; 
} 

데모 : http://ideone.com/30UBzS

내가 잘못 어떤 크기의 5의 v을 가지고 두 객체를 기대?

이유 코드를 중복 작성하면 cls()cls(n)으로 별도의 코드를 작성해야하기 때문입니다.

+0

은'{cls (5);}'오타입니다. 그것은'v.resize (5)'; – stardust

+0

아니, 왜 묻는거야? – mchen

+0

그건 제 요점입니다. 제 2 생성자가 그것을 처리하기를 바랍니다. 실제 코드 전체에서 단지'v.resize' 이상을 가지고 있기 때문에 코드 반복을 피하기를 희망했습니다. – mchen

답변

2

은 당신이하고있는 생각하고 있지 않습니다. ;에서 파기 된 두 번째 cls 생성자를 사용하여 임시 변수를 만듭니다. 당신이 C++ 11을 지원하는 컴파일러가없는 경우

cls() : cls(5) { } 

, 당신은 다른에 공통의 초기화를 뽑을 수 :

당신은 당신이 원하는 것을 달성하기 위해 C++ (11)의 위임 생성자를 사용할 수 있습니다

다음
class cls { 
public: 
    cls()   { init(5); } 
    cls(int n)  { init(n); } 
    std::vector<int> v; 
private: 
    void init(int n) { v.resize(n); } 
}; 
0

당신은

cls() {cls(5);} 

cls() {v.resize(5);} 

에 그렇지 않으면 생성자에서 새 임시 cls를 만들고 그것을 무시하는 변경해야합니다.


가 아니면 delegate the constructor (C++ 11)하려면이

cls() : cls(5) {} 
// ^^ ^
//  | use cls(int n) 

위임 생성자처럼 할 만 생성자의 member initialization 목록에 사용할 수 있습니다. cls::cls() 생성자의 cls(5); 내부를 호출

+0

그래서 일반 함수처럼'cls (n) '을 호출 할 수 없습니까? 만약 내가'cls() {dostuff(); cls (5); ...}'? – mchen

+0

@MiloChen'cls (5)'는 새로운 클래스를 정상적으로 생성합니다. 다른 생성자의 멤버 초기화 목록에있는 경우는 예외입니다. – stardust

+0

적어도 왜 언급하는지 downvote 바랍니다. – stardust

0

는 당신이 필요로하는 무엇을 : : 기능,이 두 생성자는 호출

class cls 
{ 
public: 
     cls() 
     : 
     v(5){}    // create v that contains 5 elements (each initialized to 0) - note: this is NOT resizing 

     explicit cls(const int size) 
     : 
     v(size){} 
private:  
     std::vector<int> v; 
}; 

물론 살아있는 물체의 크기를 조절해야한다면이 스레드에서 이미 언급 한 '크기 조절'방법이 필요합니다.

0

cal(5)는 객체가 캡슐화 식의 말에 파괴됩니다 임시 의미의 사실 완전히 다른 객체를 생성한다. 또는 컴파일러 최적화로 인해 전혀 호출되지 않을 수도 있습니다.

하지만 그와

옆으로, 생성자 호출 만 생성자를 호출 원래 개체 임시가 아니라 영향을 미칩니다.

당신의 의도가 코드를 짧게 만드는 것이 었 경우, 당신은 (당신이 단순히 Delegating Constructor 기능을 사용할 수있는 경우에 대비하여 컴파일러를 가정하면 C++ 11을 지원하지 않습니다)이 않는 멤버 함수를 작성해야합니다 :

class cls 
{ 
    void resize(int n) 
    { 
     v.resize(n); 
    } 

    public: 
     cls()   { resize(5); } 
     cls(int n)  { resize(n); } 
     std::vector<int> v; 
};