나는 추상적 인 기본 클래스와 템플릿 파생 클래스를 가지고있다. 파생 된 객체는 파생 된 객체의 이전 인스턴스와 정수로 구성 될 수 있습니다. 지금까지 우리는 C++ : 어떻게 static_cast를 피할 수 있습니까?
struct base {
/* ...pure virtual functions here... */
virtual ~base() = default;
/* NO DATA */
};
template <class D>
struct derived : base {
derived() = default;
derived(int x, const derived& previous) {
/* to construct I need access to previous.data_ */
}
/* ...overriden virtual functions here... */
~derived() = default;
D data_;
};
는 파생 클래스의 생성자가
previous
파생 된 개체의
data_
멤버에 액세스 할 수 있어야한다는 사실을 명심해야합니다. 이제
derived<D>
유형의 객체를 생성하는 함수를 만들고 정수 및 이전 인스턴스 인
derived<D>
을 입력하고
base
에 대한 포인터를 반환합니다. 문제는 사용자가
base
클래스 포인터로 작업되기 때문에, 함수가 다음과 같이해야한다는 것입니다 :
template <class D>
std::shared_ptr<base> getNext(int x, std::shared_ptr<base> current) {
return std::make_shared<derived<D>>(x, *current); /* ERROR */
}
이를, 독자가 추측 한 것처럼 알려진 변환이 없다는 것을 말하는 컴파일 오류를 생성 base
에서 derived<D>
까지 내가 사용할 수있는 한 가지는 기본 객체의 유형이 항상 derived<D>
이 될 것이므로 static_cast<derived<D>&>(*current)
이지만 가능한 경우 모든 캐스트를 피하고 싶습니다. 모든 아이디어가이 문제를 극복하는 방법>? 미리 감사드립니다!
왜 복사 생성자를 사용하지 않으시겠습니까? –
@John Smith : 파생 생성자는 단순히 이전 객체를 복사하는 것이 아닙니다. 그것은 이전 객체에서 발견 된 데이터를 사용하여 자체 객체를 생성하기위한 것입니다. – linuxfever
@HeywoodFloyd : 나는 그것이 중요 할 것이라고 생각하지 않는다.문제점은 리턴 유형이 아닌 getNext의 입력 매개 변수에 의해 작성됩니다. – linuxfever