2015-02-05 6 views
-4

기본 클래스 및 파생 클래스와 함께 기본 클래스에 대한 참조를 반환하는 함수가 있습니다. 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; 
} 
+2

'GetAnimal()'은 값으로'Animal'을 반환하기 때문에'unique_ptr'을 어떻게 만들 수 있는지 보지 못했습니다. 그리고'make_unique'는 여기서 사용하는 잘못된 도구입니다. 실제로 컴파일하여 문제를 설명하는 코드를 게시하십시오. – Praetorian

+0

나는 오타가 있다고 생각한다. 및 Data :: MarshalValue는 선언에 Value를 반환하고 해당 정의에 Title을 반환합니다. –

+0

아니요, ^는 관리되는 클래스 포인터 참조입니다. 이 코드는 C++/CLI 응용 프로그램에 있습니다. Data :: MarshalValue까지는 해당 함수에 대한 코드를 나열하지 않았으므로 Value not Value를 반환합니다. 돌아 오는 제목은 MarshalTitle입니다. MarshalTitle의 핵심은 Value의 기본 클래스에서 파생 클래스의 클래스로 캐스팅한다는 것입니다. 실제로'Title udefn = * std :: make_unique (MarshalValue (mdefn));'줄에 주조가 발생합니다. – <span class="text-secondary"> <small> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/3072517/">user3072517</a></span> <span></span> </small> </span> </p> </div> </div> </div> </div> </div> </article> </div> <div class="answer-title"> <span class="text-logo margin-top-sm">A</span> <h2 class="title h4">답변</h2> </div> <div class="item-description text-md markdown-body margin-bottom-40 voidso"> <article class="board-top-1 padding-top-10"> <div class="post-col vote-info"> <span class="count">0<i class="fa fa-thumbs-up"></i></span> </div> <div class="post-offset"> <div class="answer fmt"> <p>귀하의 문제는 귀하가 갖고있는 것이 아닙니다. 개인 상속</p> <pre><code class="prettyprint-override">class Dog : private Animal {} </code></pre> <p>, 당신의 개는 동물이 아니다 : 당신의 코드가 상속이 개인을 의미하고, 다음에 해당 때문에 혼동된다. C++는 당신을 위해 그것을 할 것이기 때문에 </p> <pre><code class="prettyprint-override">class Dog : public Animal {} </code></pre> <p></p> 그런 다음 당신이 실제로 아무것도 다운 캐스트 할 필요가 없습니다 : 당신이 정말로 정기적으로 상속을 원하는 반면 <p></p> <p>.</p> <p>공공 상속으로, 다음은 사본없이 작동합니다</p> <pre><code class="prettyprint-override">void myFun(Animal&); int main() { Dog dog; myFun(dog); } </code></pre> </div> <div class="post-info"> <div class="post-meta row"> <p class="text-secondary col-lg-6"> <span class="source"> <a rel="noopener" target="_blank" href="https://stackoverflow.com/q/28353588">출처</a> </span> </p> <p class="text-secondary col-lg-6"> <span class="float-right date"> <span>2015-02-05 20:40:26</span> </p> <p class="col-12"></p> <p class="col-12"></p></div> </div> <!-- comments --> <div class="comments"> <div itemprop="comment" class="post-comment"> <div class="row"> <div class="col-lg-1"><span class="text-secondary">+0</span></div> <div class="col-lg-11"> <p class="commenttext">실제로'class Dog : public Animal {}'로 정의했습니다. 내가 그것을 입력 할 때 나는 그것을 놓쳤다. 그러나 make_unique를 거치지 않으면 오류가 발생한다 : 적절한 사용자 정의 변환이 없다. 그것은 생성자를 찾고 다운 캐스팅보다는 값으로 복사하려고한다는 것을 말해줍니다. – <span class="text-secondary"> <small> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/3072517/">user3072517</a></span> <span></span> </small> </span> </p> </div> </div> </div> <div itemprop="comment" class="post-comment"> <div class="row"> <div class="col-lg-1"><span class="text-secondary">+0</span></div> <div class="col-lg-11"> <p class="commenttext">확인. GetDog()에서 실제로 첫 번째 줄에 복사본을 만듭니다. 당신이 말하는 오류를 유발하는 코드를 제공 할 수 있습니까? – <span class="text-secondary"> <small> <span></span> </small> </span> </p> </div> </div> </div> </div> </div> </article> <div> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="1038284119" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <article class="board-top-1 padding-top-10"> <div class="post-col vote-info"> <span class="count">0<i class="fa fa-thumbs-up"></i></span> </div> <div class="post-offset"> <div class="answer fmt"> <p>좋아, 나는 원래의 질문에 대한 답을 발견했다. 짧게는 이렇게하는 것이 안전하지 않습니다. 그것은 주조 평가를 우회하고 런타임에 개스킷을 날려 버릴 것입니다.</p> <p>실제로 중첩 된 파생 클래스의 수가 많아서 실제 문제가 알려지지 않은 것으로 밝혀졌으며 그 중 하나에는 실제로 다운 캐스팅 생성자가 없었습니다.</p> <p>효과적으로, 그것은이 같은 밝혀졌다 :이 클래스의 각각의 라인을 따라 정의 뭔가했다 </p> <pre><code class="prettyprint-override">class A() {} class AA() : public A {} class AAA() : public AA {} class AAAA() : public AAA {} </code></pre> <p></p> : 클래스 AAA()에서 <p></p> <pre><code class="prettyprint-override">class AAAA() : public AAA { AAAA(); virtual ~AAAA() // Downcasting constructor AAAA(const AAA &base) : AAA(base) {}; } </code></pre> <p>을, 그러나 AA에 대한 다운 캐스팅 생성자가 누락되었지만 모든 컴파일러가 AAAA (AAA)에 적합한 생성자를 찾을 수 없다는 것을보고 할 수있었습니다.</p> <p>실제로 체인에 끊김이 있었기 때문에 AA 이상의 레벨에서 아무 것도 얻을 수 없었습니다 (이것이 내가 시도한 것입니다).</p> <p>교훈 : 깊이 파생 된 객체 체인을 만들 때 항상 다운 캐스팅 생성자가 각 클래스마다 존재하는지 확인하고 공개인지 확인하십시오.</p> <p>다른 클래스 집합의 다른 인스턴스에서 구조체를 클래스로 변환하고 Public :을 잊어 버렸습니다. 이 경우 접근 할 수없는 경고 메시지가 표시되지 않고 캐스팅 오류가 발생합니다. 모든 것이 괜찮아 보이지만 체인이 끊어졌습니다.</p> <p>이렇게하면 비슷한 문제가있는 다른 사람의 시간을 절약 할 수 있습니다.</p> </div> <div class="post-info"> <div class="post-meta row"> <p class="text-secondary col-lg-6"> <span class="source"> <a rel="noopener" target="_blank" href="https://stackoverflow.com/q/28357520">출처</a> </span> </p> <p class="text-secondary col-lg-6"> <span class="float-right date"> <span>2015-02-06 02:20:56</span> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/3072517/">user3072517</a></span> </p> <p class="col-12"></p> <p class="col-12"></p></div> </div> </div> </article> </div> <div class="clearfix"> </div> <div> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-6208739752673518" data-ad-slot="1575177025"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="padding-top-10"></div> </div> </div> <script type="text/javascript" src="http://img.uwenku.com/uwenku/script/side.js?t=1644592048821"></script> <script type="text/javascript" src="http://img.uwenku.com/uwenku/plugin/highlight/highlight.pack.js"></script> <link href="http://img.uwenku.com/uwenku/plugin/highlight/styles/docco.css" media="screen" rel="stylesheet" type="text/css" /> <script type="text/javascript"> $('pre').each(function(i, e) { hljs.highlightBlock(e, "<span class='indent'> </span>", false) }); </script> <div class="col-lg-3 col-md-4 col-sm-5"> <div id="rightTop"> <div class="row"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="5415218910" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="row sidebar panel panel-default"> <div class="panel-heading font-bold"> 최근 질문 </div> <div class="m-b-sm m-t-sm clearfix"> <ul class="side_article_list"> <li class="side_article_list_item"> 1. <a href="http://ko.uwenku.com/question/p-wecpyynt-mp.html" target="_blank" title="AsyncStorage를 사용하여 API 데이터를 캐시하는 방법 React 네이티브"> AsyncStorage를 사용하여 API 데이터를 캐시하는 방법 React 네이티브 </a> </li> <li class="side_article_list_item"> 2. <a href="http://ko.uwenku.com/question/p-oyhurkli-md.html" target="_blank" title="잡히지 않은 오류 : 정의되지 않은 함수를 호출했습니다. 번창 테마 중 하나가 thrive_get_theme_options()에 설치되었습니다."> 잡히지 않은 오류 : 정의되지 않은 함수를 호출했습니다. 번창 테마 중 하나가 thrive_get_theme_options()에 설치되었습니다. </a> </li> <li class="side_article_list_item"> 3. <a href="http://ko.uwenku.com/question/p-qxadfmng-mk.html" target="_blank" title="있는 LinearLayout은"> 있는 LinearLayout은 </a> </li> <li class="side_article_list_item"> 4. <a href="http://ko.uwenku.com/question/p-cezvdoyh-kz.html" target="_blank" title="의 Visio : 데이터베이스"> 의 Visio : 데이터베이스 </a> </li> <li class="side_article_list_item"> 5. <a href="http://ko.uwenku.com/question/p-ozalulfy-kh.html" target="_blank" title="부분 집합 합 중첩 된 하위 문제 (동적 프로그래밍)"> 부분 집합 합 중첩 된 하위 문제 (동적 프로그래밍) </a> </li> <li class="side_article_list_item"> 6. <a href="http://ko.uwenku.com/question/p-veddvtri-hy.html" target="_blank" title="PHP로 데이터베이스에서 페르시아어 텍스트 가져 오기"> PHP로 데이터베이스에서 페르시아어 텍스트 가져 오기 </a> </li> <li class="side_article_list_item"> 7. <a href="http://ko.uwenku.com/question/p-eqpiicig-gu.html" target="_blank" title="Android Studio의 디버그 (logcat?) 크기를 늘리십시오."> Android Studio의 디버그 (logcat?) 크기를 늘리십시오. </a> </li> <li class="side_article_list_item"> 8. <a href="http://ko.uwenku.com/question/p-stldfvsg-hb.html" target="_blank" title="laravel이 ISO8601 형식의 날짜 시간을 인식하지 못함"> laravel이 ISO8601 형식의 날짜 시간을 인식하지 못함 </a> </li> <li class="side_article_list_item"> 9. <a href="http://ko.uwenku.com/question/p-tjlqyqpi-ea.html" target="_blank" title="다른 클래스 라이브러리에서 Windows Forms의 인스턴스 UserControl을 클릭 할 때"> 다른 클래스 라이브러리에서 Windows Forms의 인스턴스 UserControl을 클릭 할 때 </a> </li> <li class="side_article_list_item"> 10. <a href="http://ko.uwenku.com/question/p-xykzmiqy-em.html" target="_blank" title="특정 g 드라이브 폴더에 파일을 자동으로 업로드하는 Google 웹 앱/스크립트"> 특정 g 드라이브 폴더에 파일을 자동으로 업로드하는 Google 웹 앱/스크립트 </a> </li> </ul> </div> </div> </div> <p class="article-nav-bar"></p> <div class="row sidebar article-nav"> <div class="row box_white visible-sm visible-md visible-lg margin-zero"> <div class="top"> <h3 class="title"><i class="glyphicon glyphicon-th-list"></i> 관련 문제</h3> </div> <div class="article-relative-content"> <ul class="side_article_list"> <li class="side_article_list_item">관련 문제 없음^_^</li> </ul> </div> </div> </div> </div> </div> </div> </div><!-- wrap end--> <!-- footer --> <footer id="footer"> <div class="bg-simple lt"> <div class="container"> <div class="row padder-v m-t"> <div class="col-xs-8"> <ul class="list-inline"> <li><a href="http://ko.uwenku.com/contact">문의하기</a></li> <li>© 2020 KO.UWENKU.COM</li> <li><a target="_blank" href="https://beian.miit.gov.cn/">沪ICP备13005482号-4</a></li> <li><script type="text/javascript" src="https://v1.cnzz.com/z_stat.php?id=1280101193&web_id=1280101193"></script></li> <li><a href="http://www.uwenku.com/" target="_blank" title="优文库">简体中文</a></li> <li><a href="http://hk.uwenku.com/" target="_blank" title="優文庫">繁體中文</a></li> <li><a href="http://ru.uwenku.com/" target="_blank" title="поле вопросов и ответов">Русский</a></li> <li><a href="http://de.uwenku.com/" target="_blank" title="Frage - und - antwort - Park">Deutsch</a></li> <li><a href="http://es.uwenku.com/" target="_blank" title="Preguntas y respuestas">Español</a></li> <li><a href="http://hi.uwenku.com/" target="_blank" title="कार्यक्रम प्रश्न और उत्तर पार्क">हिन्दी</a></li> <li><a href="http://it.uwenku.com/" target="_blank" title="IL Programma di chiedere Park">Italiano</a></li> <li><a href="http://ja.uwenku.com/" target="_blank" title="プログラム問答園区">日本語</a></li> <li><a href="http://ko.uwenku.com/" target="_blank" title="프로그램 문답 단지">한국어</a></li> <li><a href="http://pl.uwenku.com/" target="_blank" title="program o park">Polski</a></li> <li><a href="http://tr.uwenku.com/" target="_blank" title="Program soru ve cevap parkı">Türkçe</a></li> <li><a href="http://vi.uwenku.com/" target="_blank" title="Đáp ứng viên">Tiếng Việt</a></li> <li><a href="http://fr.uwenku.com/" target="_blank" title="Programme interrogation Park">Française</a></li> </ul> </div> </div> </div> </div> </div> </footer> <!-- / footer --> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f78a970f17b19a79fc477a3378096f29"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </body> </html>