기본 클래스 및 파생 클래스와 함께 기본 클래스에 대한 참조를 반환하는 함수가 있습니다. make_unique를 사용하고 포인터를 다운 캐스트해도 안전합니까?make_unique를 통해 다운 캐스팅 된 파생 오브젝트를 참조 해제하는 것이 안전합니까?
복사 작업을 피하려고합니다.
class Animal {}
class Dog : Animal {}
Animal GetAnimal() { ... }
Dog GetDog() {
Dog dog = *std::make_unique<Dog>(GetAnimal());
return dog;
}
아니면 더 간단한 방법이 있습니까?
편집 :
// Convert from (m)anaged to (u)nmanaged Title
Title Data::MarshalTitle(TitleMap ^mdefn) {
Title udefn = MarshalValue(mdefn);
return udefn;
}
다음 MarshalValue는 다음과 같이 정의된다 : 여기
가 내가 위에서 보여주는하고있는 무슨에 아주 가까이있는 (실제 코드입니다
Value Data::MarshalValue(TitleMap ^mdefn)
자, 여기서 볼 수없는 것은 Value가 기본 클래스이고 Title이 파생 클래스라는 것입니다.
컴파일러에서 얻은 오류는 다음과 같습니다.
error C2440: 'initializing' : cannot convert from 'Definitions::Value' to 'Definitions::Title' D:\Projects\Parsers\View.cpp
Intellisense는 Value에서 Title 로의 사용자 정의 변환이 적절하지 않다고 알려줍니다.
그러나 이것은 컴파일러를 통해 정상적으로 처리되지만 이것이 안전한 지 확신 할 수 없습니다.
// Convert from (m)anaged to (u)nmanaged Title Dimension definition
Title Data::MarshalTitle(TitleMap ^mdefn) {
Title udefn = *std::make_unique<Title>(MarshalValue(mdefn));
return udefn;
}
'GetAnimal()'은 값으로'Animal'을 반환하기 때문에'unique_ptr'을 어떻게 만들 수 있는지 보지 못했습니다. 그리고'make_unique'는 여기서 사용하는 잘못된 도구입니다. 실제로 컴파일하여 문제를 설명하는 코드를 게시하십시오. – Praetorian
나는 오타가 있다고 생각한다. 및 Data :: MarshalValue는 선언에 Value를 반환하고 해당 정의에 Title을 반환합니다. –
아니요, ^는 관리되는 클래스 포인터 참조입니다. 이 코드는 C++/CLI 응용 프로그램에 있습니다. Data :: MarshalValue까지는 해당 함수에 대한 코드를 나열하지 않았으므로 Value not Value를 반환합니다. 돌아 오는 제목은 MarshalTitle입니다. MarshalTitle의 핵심은 Value의 기본 클래스에서 파생 클래스의 클래스로 캐스팅한다는 것입니다. 실제로'Title udefn = * std :: make_unique