1

私のコードからの抜粋があります:

const std::pair<Info, const ElementHandler&>& handle () const {
                    FileHandler fileHandler = FileHandler();
                    std::pair<Info, const ElementHandler&> result = std::pair<Info, const FileHandler&> ( info, fileHandler );
                    return result;
                }

次のコンパイルエラーがあります。

error: cannot declare field ‘std::pair<Synchronizer::Info, Synchronizer::ElementHandler>::second’ to be of abstract type ‘Synchronizer::ElementHandler’

アイデアを維持するためのコードをどのように書くことができますか?それは可能ですか、それともポインタと動的割り当てを使用する必要がありますか?

4

3 に答える 3

1
  1. 、またはおそらくある種のとしてfileHandler割り当てます。関数が終了するとすぐに、への現在の参照は無効になります。newshared_ptrfileHandler
  2. result参照ではなく値で返します。
于 2012-04-17T09:08:24.060 に答える
1

とにかく動的割り当てを使用する必要があります。

関数内でローカル変数'fileHandler'を作成し、それへの参照を返します。関数が戻るとすぐに、'fileHandler'はスコープ外になり、破棄されて、参照が無効になります。

スマートポインタ(unique_ptr、shared_ptr、...)を使用すると、この問題をうまく解決できると思います。スマートポインターはElementHandlerを指すことができ、ElementHandlerに仮想デストラクタがある場合、ペアが削除されたりスコープ外になったりすると、正しく破棄されます。

于 2012-04-17T09:10:47.803 に答える
1

「ローカルスコープでの動的割り当てを回避する」。

それがあなたの壊れたコードの背後にある原動力となる必要性であるならば、私はあなたが望まないことをするためにそれを修正する方法をあなたに教えることによって傾向に従わないでしょう;-)。代わりに、その影響を適切に考慮する必要があります。呼び出し元のニーズに一致するスコープを持つ変数が必要です。ローカル自動変数は除外する必要があります-関数が戻ると破棄されます。だから、あなたはできる:

  • 関数スコープstatic変数またはグローバル変数を使用しますが、関数が呼び出されるたびに同じ変数になり、スレッドセーフの問題が発生する可能性があります(コンパイラはスレッド固有のキーワードをサポートしている可能性があり、POSIXにはスレッドをサポートする関数があります-特定のデータ-ただし、スレッドあたり1オブジェクトはまだ制限が多すぎる可能性があります)
  • 多くの変数用のスペースを備えたバッファを作成し、それらの存続期間を制御して、クライアントコードに適した方法で再利用します(たとえば、クライアントが返された順序でそれらを解放し、それ以上は必要ないことを知って、配列をローテーションします同時にアレイサイズ)
  • クライアントコードに存続期間について心配させ(おそらくあなたよりも多くのことを知っている)、結果とともにロードする変数を提供します(例bool load_my_x(X&);
    • ここでの問題は、呼び出し元が単なるElementHandlerではなくFileHandlerにスペースを割り当てる必要があることです。
于 2012-04-17T09:16:26.287 に答える