2014-10-20 4 views
0

저는 이것이 다소 간단한 질문이며 나머지 코드에도 달려 있다는 것을 알고 있습니다 만, 나는 엄지 손가락 규칙에 더 많은 관심이 있습니다.생성자에서 멤버 함수를 호출해야합니까?

그래서 어떤 경우에 생성자 내부에서 함수를 호출하는 것이 적절합니까?

바람직 무엇인가

ClassA obj1; 
obj1.memFun(); 

또는

ClassA obj1; 
//where constructor of ClassA is 
ClassA::ClassA(){ memFun(); } 
+2

에 따라 다릅니다. 'memfun()'이'virtual'으로 선언 되었다면, 이것을하지 말아야합니다. –

+0

memFun이하는 일에 대해 자세히 설명해 주시면보다 구체적인 조언을 드릴 수 있습니다. 예를 들어 그 논리가 초기화 목록에 적합 할 수 있습니다. –

답변

4

그것은 생성자에서 멤버 함수를 호출 전혀 해를 끼치 없습니다. 그러나 생성자가 완료된 후에 동적 바인딩 메커니즘이 시작되므로 멤버 함수가 가상이 아닌 멤버인지 확인하십시오. memFun 가상 다음 ClassA::memFun

+0

그게 내가 듣고 싶었던거야 :) – TheGuyWithStreetCred

+0

@ user2202368 ans? –

+0

제가 의도했기 때문에 – TheGuyWithStreetCred

4

생성자 작업에 바인딩 memFun를 호출, 서브 클래스에서 오버라이드 (override)하는 경우는 유효한, 사용 가능한 상태에서 개체를 만드는 것입니다. 따라서 객체의 인스턴스가 유효하도록 함수 호출이 필요하면 생성자에서 호출하십시오.

생성자에서 virtual 메서드를 호출하지 마십시오. 문제가 발생할 수 있습니다.

+0

감사합니다. 혼란이 증발했습니다. – TheGuyWithStreetCred

+0

@nvoigt 가상 메서드를 호출 할 때 호출이 가상이 아닌 다른 문제가 있습니까? – user2079303

1

사용자 코드의 첫 번째 줄을 실행하기 전에 개체가 완전히 설정되었으므로 일반적으로 생성자 내에서 멤버 함수를 호출하는 것이 안전합니다. 그러나 멤버 함수가 생성 또는 삭제 중에 추상 기본 클래스에 대한 가상 멤버 함수를 호출하는 것은 잠재적으로 안전하지 않습니다. 경우 memFun에서

http://msdn.microsoft.com/en-us/library/s8e39b8h.aspx

+0

덕분에 상속을 다룰 때 피할 수 있습니다. – TheGuyWithStreetCred

1

는 가상이고 당신은, 개체가 완전히 구축되는 것이 전화 공장 방법을 고려할 필요가 없습니다. 다음과 같이하십시오 :

static ClassA* makeX(){ 
    ClassA* pObj = new ClassX(); // ClassX is a subclass of ClassA. 
    pObj->memFun(); 
    return pObj ; 
} 

그런 다음 ClassA 및 ClassX 생성자를 보호하십시오.

0

개념적으로 은 생성자의 멤버 함수를 호출하는 것이 가장 좋지 않을 수 있습니다. 그 이유는 생성자가 개체 초기화 및 생성 이상의 역할을한다는 것을 의미하기 때문입니다. 그러나 private 멤버 함수를 가지는 것은 클래스의 인터페이스의 일부가 아니므로 잘해야하며 생성자에 대한 도우미 함수로 간주 될 수 있습니다.

관련 문제