-2
class FunctionBase {
  public:
    const double operator() (double a_) const = 0;
}

class AddN : public FunctionBase {
  public:
    AddN (int n_) : FunctionBase(), _n(n_) {}
    const double operator() (double a_) const { return (a_ + n); }
  private:
    int _n;
}

FunctionBase *コンパイラが aAddNから aを再構築できないため、プレースホルダーとして使用する必要がありますかFunctionBase、または使用する方法はありますFunctionBase &か?

- 編集 -

私は を持っていstd::map<std::string, FunctionBase *>ますが、ポインターの代わりに参照を使用できるかどうかに興味があるので、使用する前にポインターが NULL ではないことを保証できます。コードのエラー耐性を高めようとしています。に切り替えるとFunctionBase &、コンパイラはインスタンス化できないと不平を言いますAddNが、FunctionBase &これは完全に理にかなっていますが、私が知らなかった一般的な回避策があることを望んでいました.

4

1 に答える 1

1

クラス階層を定義する代わりにstd::function、 またはを使用することをお勧めしboost::functionます。これらは callable を保持でき、mapby 値に格納できるため、関数オブジェクトの有効期間が保証されます。

std::map<std::string, std::function<double(double)>> functions;

これにより、クラス階層を使用する必要がなくなり、マップに追加された関数を関連付ける必要がないため、より柔軟になります。

ポインタの代わりに参照を使用しても、参照されているオブジェクトがまだ存在することは保証されないことに注意してください。ダングリング ポインターと同様に、ダングリング参照も可能です。

于 2013-03-17T22:13:37.907 に答える