class A{
A(int a = 5){
DoSomething();
A();
}
A(){...}
}
첫 번째 생성자가 두 번째 생성자를 호출 할 수 있습니까?생성자가 C++에서 다른 생성자를 호출 할 수 있습니까?
class A{
A(int a = 5){
DoSomething();
A();
}
A(){...}
}
첫 번째 생성자가 두 번째 생성자를 호출 할 수 있습니까?생성자가 C++에서 다른 생성자를 호출 할 수 있습니까?
아니요 before C++11입니다.
공통 기능을 별도의 기능으로 추출하십시오. 보통이 함수의 이름은 입니다. construct()입니다.
"소위"두 번째 호출은 컴파일되지만 C++에서는 다른 의미를 갖습니다. 임시 객체는 새로운 객체를 생성하여 명령문의 끝에서 즉시 삭제됩니다. 그래서 아니야.
그러나 소멸자는 문제없이 호출 할 수 있습니다.
+1 - 'construct()'는 좋은 이름입니다. – peterchen
+1 - 다음 C++ 버전 (C++ 0x)에서 동일한 클래스의 생성자에서 생성자를 호출 할 수 있음을 추가해야합니다. http://www2.research.att.com/~bs/C++0xFAQ.html#delegating-ctor – Klaim
construct() 함수의 예제를 줄 수 있습니까? 나는 그것이 아주 간단하다는 것을 안다. 그러나 나는 사람들이 그것을 유용하다고 생각할 것이라고 생각한다. – MattClimbs
C++0x
아니요, 아니요.
하지만, 내가 * 게재 위치 연산자를 사용하여 그것을 할 수있는 정말 끔찍한 방법으로 왔어요 단지 학문적 관심에서 "새로운"(사람 관리는이게 얼마나 휴대용 지적?)
#include <new>
#include <iostream>
class A
{
public:
A(int i, int j)
: i_(i), j_(j) { }
A(int i)
{ new (this) A(i, 13); }
int i_,j_;
};
int
main() {
A a1(10,11), a2(10);
std::cout
<< a1.i_ << ", "
<< a1.j_ << std::endl
<< a2.i_ << ", "
<< a2.j_ << std::endl;
return 0;
}
* 지옥 번호는 제작 코드에 기재하지 않았습니다.
꽤 휴대용이라고 생각합니다. placement-new는 ISO C++ 표준에 있습니다. "그러나 다른 용도로는 생성자를 직접 호출하는 등의 용도가 있으며 C++ 언어에서는 그렇지 않습니다." 위키 백과에서 : http://en.wikipedia.org/wiki/Placement_syntax – haavee
A가 B 클래스에서 파생되면 어떻게됩니까? B의 생성자가 호출 된 다음 A가 호출되어 새로운 A '(다른 A 생성자)를 호출하고 이미 B에서 수행 한 모든 작업을 덮어 쓰고 B를 다시 호출 한 다음 A'를 호출합니다. 결론 : B가 의미가있는 (즉, 자원을 할당하는) 경우, 이는 코드를 깨뜨릴 것이다 (즉, 자원 유출을 유발 함). – paercebal
@paercebal 예, A가 추상 클래스 인 경우에도 작동하지 않습니다. –
답변은 사실 "예"이지만 다른 사람들이 제안했듯이 원하는대로하지 않습니다. 물론 암시 적 또는 명시 적으로 기본 클래스의 생성자를 사용할 수 있습니다.
struct B {
B() {}
B(int x) {}
};
struct A : public B {
A() {} // calls B() implicitly
A(int a, int b) : B(b) {} // calls B(int) explicitly
};
직접적으로 사용할 수 없습니다. 이 문제를 해결할 수있는 몇 가지 방법이 있습니다.
클래스 생성자의 초기화 프로그램 목록에서 모든 기본 클래스 및 모든 멤버 변수에 대해 생성자를 호출 할 수 있습니다.
그래서 일반적으로 클래스를 리팩터링하여 여러 개의 작은 클래스로 나눠서 문제를 해결할 수 있습니다. 일반적으로 실행되는 코드는 멤버 객체 또는 기본 클래스에 배치 할 수 있습니다. 그런 다음 각 주 클래스의 생성자는 해당 멤버를 초기화하는 데 사용할 construcotr을 결정해야합니다.
class B {
B() { }
B(int b) { DoSomething(); }
}
class A{
A(int a = 5) : b(a) { } // call B's constructor which does something
A() : b() {} // call B's constructor which does nothing
B b;
};
이전 질문입니다. HTTPS : // HTTP : 그러나,
class A{
A(int a = 5){
DoSomething();
A();
}
A(){...}
}
여기
class A{
A(int a = 5){
*this = A();
DoSomething();
}
A(){...}
}
나는'* this = A();라고 생각한다. 당신이 원하지 않을 수도있는 기본 복사 생성자 (당신이 정의하지 않았다면)를 사용할 것인가? – austinmarton
비슷한 질문이 될 수 //stackoverflow.com/questions/308276/c-call-constructor-from-constructor –