2016-07-26 6 views
-4

以下のコードは、マップ内のunique_ptrからの参照を使用してオブジェクトを生成します。 unique_ptrからの後のリファレンスは更新のトレースを示していません。unique_ptrからの参照を返すことは時々オブジェクトのコピーを作成しますか?

XSSFWorkbook :: CreateCellStyleXSSFCellStyle :: CreateCellStyle工場機能のためのクライアントです。 XSSFCellStyleオブジェクトをUPTR__CellStylesMapに格納し、その参照を返します。

XSSFWorkbook :: GetStylesheetXml()後で各XSSFCellStyleへの参照を取得し、出力するXMLをそれを使用します。

XSSFWorkbook.cpp

// **************************************************************************** 
// CreateCellStyle 
// **************************************************************************** 
    XSSFCellStyle& 
    XSSFWorkbook::CreateCellStyle() 
    { map<int, unique_ptr<XSSFCellStyle>>::iterator iter__CellStylesMap; 
     unique_ptr<XSSFCellStyle>      uptr__XSSFCellStyle  = nullptr; 

     uptr__XSSFCellStyle = XSSFCellStyle::CreateCellStyle(); 
     UPTR__CellStylesMap->insert(make_pair(UPTR__CellStylesMap->size(), move(uptr__XSSFCellStyle))); 
     iter__CellStylesMap = UPTR__CellStylesMap->find(UPTR__CellStylesMap->size() - 1); 
     return *iter__CellStylesMap->second 
    } 

// **************************************************************************** 
// GetStylesheetXml 
// **************************************************************************** 
    string 
    XSSFWorkbook::GetStylesheetXml() 
    { map<int, unique_ptr<XSSFCellStyle>>::iterator iter__CellStylesMap; 
     string           str___CellStyleXfsXml = ""; 

//  ======================================================================== 
//  Build the XML for the Cell Styles. 
//  ======================================================================== 
     if(UPTR__CellStylesMap->size() > 0) 
     { str___CellStyleXfsXml += "<cellStyleXfs count=\"" + ConvertToString(UPTR__CellStylesMap->size()) + "\">"; 
      iter__CellStylesMap  = UPTR__CellStylesMap->begin(); 
      while(iter__CellStylesMap != UPTR__CellStylesMap->end()) 
//   { str___CellStyleXfsXml   += iter__CellStylesMap->second->GetXml(); 
      { XSSFCellStyle& xssf__CellStyle = *iter__CellStylesMap->second; 
       str___CellStyleXfsXml   += xssf__CellStyle.GetXml(); 
       iter__CellStylesMap++; 
      } 
      str___CellStyleXfsXml += "</cellStyleXfs>"; 
... 
    } 

/ **************************************************************************** 
// GetXml 
// **************************************************************************** 
    string 
    XSSFWorkbook::GetXml() 
    { string str___WorkbookXml = ""; 

     str___WorkbookXml += "<workbook><sheets><sheet name=\"1\" sheetId=\"1\" r:id=\"rId1\" /></sheets></workbook>"; 
     str___WorkbookXml += GetStylesheetXml(); 
... 
     return str___WorkbookXml; 
    } 

のWinMainコールXSSFWorkbook :: GETXML()次いでXSSFCellStyleへの参照を取得するためにXSSFWorkbook :: GetStylesheetXml()を呼び出すこのコードオブジェクトを作成し、そのXMLを出力します。

XSSFCellStyle xssf__CellStyle = xssf__Workbook.CreateCellStyle(); 
xssf__CellStyle.SetApplyAlignment(true); 
uptr__OoxmlTester->SetOoxml(xssf__Workbook.GetXml()); 

それはcoutの文が XXSFCellStyle :: SetApplyAlignment()が正しくApplyAlignmentプロパティを設定することを明らかにしたにも関わらず、 XSSFCellStyle :: XSSFCellStyleに設定されたデフォルト値()初期化リストが返されました。

しかし

uptr__OoxmlTester->SetOoxml(xssf__CellStyle.GetXml()); 

代わりXSSFCellStyle参照を使用しては(もちろん)更新された値を返すました。

XSSFCellStyle* 
XSSFWorkbook::CreateCellStyle() 
... 
return iter__CellStylesMap->second.get(); 

生ポインタを返すようXSSFWorkbook :: CreateCellStyle()変更のWinMainは同様

XSSFCellStyle* ptr___CellStyle = xssf__Workbook.CreateCellStyle(); 
ptr___CellStyle->SetApplyAlignment(true); 
uptr__OoxmlTester->SetOoxml(xssf__Workbook.GetXml()); 

ポインタバージョンがないことを示す、更新された値をretured実際にはXSSFCellStyleのインスタンスをUPTR__CellStylesMap

XSSFWorkbook :: CreateCellStyle()の基準バージョンはが私にXSSFCellStyleオブジェクトへの参照を与えるどのように私は見ていないではないでUPTR__CellStylesMap(コピー?)、XSSFWorkbookで同じコードに対し、 :: GetCellStyleXml()XSSFCellStyleのオブジェクトをUPTR__CellStylesMapに取得します。

NULL XSSFCellStyleのようなものが存在しないので、私はunique_ptrをバージョンの賛成で参照バージョンを放棄してきましたが、私はまだどのように決して再作成この謎に知っているように思います。

P.S.私のコーディングスタイルは、慣習に違反し、一部の人々を混乱させる。それはあなたを気にしないでください。

+6

[MVCE](http://stackoverflow.com/help/mcve)を制作できますか?これはかなり簡潔な質問でなければならないもののためのあまりにも多くのコードです。 – TartanLlama

+0

True;投稿するまでに6時間かかりました。今週末までMVCEで働く時間はありません。 – pbyhistorian

+0

私は[あなた](https://www.youtube.com/watch?v=BiYliKliFvs)の話をお勧めします。とりわけ、 'GetXml'というメソッドの' // GetXml'のようなコメントは、素敵です。 – user463035818

答えて

1

はい、あなたは、この行のコピーを作成している:

XSSFCellStyle xssf__CellStyle = xssf__Workbook.CreateCellStyle(); 

ではなく、使用して新しい値を初期化することにより、コピーはあなたが暗示として、参照を返すことによって作成された、ではないことに留意すべきです返された参照。
コピーを避けたい場合は、結果を参照またはポインタに格納する必要があります。あなたがコピー偶然回避したい場合

XSSFCellStyle& xssf__CellStyle = xssf__Workbook.CreateCellStyle(); 
//or this 
XSSFCellStyle* ptr__CellStyle = &xssf__Workbook.CreateCellStyle(); 

あなたは、このようなXSSFCellStyleのコピーコンストラクタ削除を検討すべきである:私はそれは文体の決定を知っている

XSSFCellStyle(const XSSFCellStyle&) = delete; 

を、私は思いませんCreateで始まる関数は、参照を返す必要があります。

+0

私はとても近づいた。参照を返す関数の命名規則は "get ...()"のようです。 – pbyhistorian

+0

@pbyhistorianはい私はおそらく、アクセサをアクセサに返すことを関連付けるだろうが、あなたのケースでは、新しいオブジェクトも作成されていることを伝える必要があるので、 'getNewXYZ()'は私に最も驚かないだろう。しかしそれについて考えると、「作成」はそれほど悪くはありません。いずれにしても、関数ドキュメントの所有権(またはこの場合はその欠如)/返されたオブジェクト参照(またはポインタ)の存続期間を文書化することは、おそらく名前よりも重要です。 – PeterT

関連する問題