次のコードを持っています。これはpqxx::result
行のベクトルの結果を反復処理します。ベクトルが他のメソッドから返されたときにC++がベクトル要素にアクセスできません
std::unique_ptr<std::vector<pqxx::result::tuple>>
filteredRowsPtr = getFilteredAssignmentRowsPtr(unfilteredRows);
std::vector<pqxx::result::tuple> filteredRows = *filteredRowsPtr;
for(int i = 0; i < filteredRows.size(); i++)
{
returnMap[occurenceStudentIdStr] = returnMap[occurenceStudentIdStr] + 1;
pqxx::result::tuple currRow = filteredRows[i];
for(int j = 0; j < currRow.size(); j++)
{
std::cout << "j = " << currRow[j] << endl;
}
}
filteredRowsPtr
以下の方法により製造されるvector<pqxx::result::tuple>
からunique_ptr
である:
std::unique_ptr<std::vector<pqxx::result::tuple>>
CompletedExcersisesPerStudent::getFilteredAssignmentRowsPtr(pqxx::result unfilteredRows)
{
std::vector<pqxx::result::tuple> rowsFilteredOnGradePercentile = filter.getRowsWithValidGradePercentile(unfilteredRows);
std::vector<pqxx::result::tuple> filteredRows = filter.getRowsWithValidAssignmentTimes(rowsFilteredOnGradePercentile);
return std::make_unique<std::vector<pqxx::result::tuple>>(filteredRows);
}
ベクトルが充填されている(その上にsize()
を呼び出すと、正の数を返すので)、私はそれを反復処理することができただし、実際に行に含まれる要素にアクセスしようとすると、
currRow[j]
義務違反。
しかし:
std::vector<pqxx::result::tuple> rowsFilteredOnGradePercentile = filter.getRowsWithValidGradePercentile(unfilteredRows);
std::vector<pqxx::result::tuple> filteredRows = filter.getRowsWithValidAssignmentTimes(rowsFilteredOnGradePercentile);
期待される結果は、任意のセグメンテーション違反せずに出力される:私は以下のようなものをその方法の内容を置き換え、以下でgetFilteredAssignmentsRowPtr()
にコールを交換します。
私は間違っていますか?前もって感謝します!
スコープ外に出るローカル変数へのポインタを返すようです。なぜポインタが必要なのか尋ねることはできますか? –
'unique_ptr'は完全に冗長です。 – You
私はstd :: vector>を返そうとしました。これはうまくいきませんでしたので、私はptrを使ってみました。 –