以下のコードは、マップ内のunique_ptrからの参照を使用してオブジェクトを生成します。 unique_ptrからの後のリファレンスは更新のトレースを示していません。unique_ptrからの参照を返すことは時々オブジェクトのコピーを作成しますか?
XSSFWorkbook :: CreateCellStyleはXSSFCellStyle :: 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.私のコーディングスタイルは、慣習に違反し、一部の人々を混乱させる。それはあなたを気にしないでください。
[MVCE](http://stackoverflow.com/help/mcve)を制作できますか?これはかなり簡潔な質問でなければならないもののためのあまりにも多くのコードです。 – TartanLlama
True;投稿するまでに6時間かかりました。今週末までMVCEで働く時間はありません。 – pbyhistorian
私は[あなた](https://www.youtube.com/watch?v=BiYliKliFvs)の話をお勧めします。とりわけ、 'GetXml'というメソッドの' // GetXml'のようなコメントは、素敵です。 – user463035818