2010-04-15 2 views
2

클래스를 작성 중이며이 의심이 생겼습니다. 이것은 정의되지 않습니까? 행동? 다른 한편으로는, 나는 그것의 추천, 또는 그것의 좋은 연습인지 모르겠다. 초기화 함수에서 예외를 던지지 않도록해야한다면 하나입니까? 그것은 완전히 괜찮 사전인스턴스가 생성되기 전에 비 멤버 함수를 호출하십시오.

+0

신체를 제공하지 않았습니다. 그냥 삭제하십시오. –

+0

@epronk. 그 샘플 코드는 괜찮지 만 괜찮습니다. – Tom

+0

'throw()'는 예외가 없다는 것을 보장하지 않습니다. 예외가 지났을 때'terminate' (또는 다른 gorgons 중 하나)를 호출 할 런타임 검사를 추가합니다. 불행하게도 예외 사양에 대한 컴파일 타임 검사는 없습니다 ... 곧 표준은 메서드가 결코 throw하지 않을 정확한 noexcept 키워드를 추가 할 것입니다. 그러나 프로그래머는이를 보장하고 개발자에게 정의되지 않은 행동의 무서운 영역. –

답변

6

//c.h 
class C{ 

    float vx,vy; 
    friend void init(C& c); 
public: 
    C(); 

}; 


//c.cpp 
C::C() 
{ 
    init(*this); 
} 

void init(C& c) //throws() to ensure no exceptions ? 
{ 
    c.vx = 0; 
    c.vy = 0; 
} 

감사합니다. 생성자의 본문을 입력하면 모든 멤버가 초기화되고 사용할 수 있습니다. (몸체가 완전히 완성 된 객체를 만들기 위해 더 많은 작업을 끝내야합니다.)

하지만 스타일이 좋지 않습니다. 더 나은 것은 단지 :

C::C() : 
vx(), vy() // or vx(0), vy(0) if you prefer to be explicit 
{} 

모든 엉망으로 버려라.


예외 사항은 안전과 관련이 없으며 생성자는 자유롭게 넘겨 줄 수 있습니다. 실제로, 당신이 성공적으로 객체를 생성 할 수 없다면, 예외를 던지는 것은 바람직한 행동 과정이다.

+0

감사합니다, 예외 부분은 약간의 의혹을 해결했습니다. 이렇게하는 것이 좋습니다. 클래스 C {float vx(); float vy(); public : ...} ;? – Tom

+0

... "등등"을 의미하고, varargs의 잘못된 사용이 아닙니다. – Tom

+0

@ 톰 : 당신이 원하는 것은 아니지만 괜찮습니다. (힌트 : 나에게 보이는 함수처럼 보입니다.) 불행히도, "이봐,이 0을 만들어서 생성자를 쓸 필요가 없다"고 말할 수있는 간단한 방법이 없다. – GManNickG

0

컨트롤이 생성자에 도달 할 때까지 모든 변수에는 기본값이 있습니다.

+0

응집체는 초기화를 얻지 못합니다. 값은 불확정합니다. – GManNickG

0

나는 이것이 당신을 물 수도있는 한 가지 특별한 경우를 생각할 수 있습니다. C가 기본 클래스가되도록 의도 된 경우 C에 대한 참조가 비 멤버 함수로 이스케이프되도록 허용하면 놀라움이 발생할 수 있습니다. 기본 클래스에서는 생성자 클래스가 아직 생성되지 않았고 가상 함수가 파생 클래스가 아닌 기본 클래스를 호출하기 때문에 생성자가 더욱 특별합니다. 비 멤버 함수는이 상태에서 객체를 가져올 것으로 예상하지 않을 수 있으며 생성자처럼 보이지 않기 때문에이를 잊어서 버그를 쉽게 알릴 수 있습니다.

아직 정의되지 않은 동작이 아닙니다. 단지 놀랍게 정의 된 동작입니다.