2017-04-15 15 views
0

関数へのポインタをパラメータとして持つコンストラクタをC++ 11で定義する方法については疑問があります。さまざまなタイプのペイオフを管理するPayoffクラスを作成しました。ストライキと現物価格を与えられたオプション。また、同じ構造(パラメータと戻り値の型)と関数へのポインタを使用して、これらの類似の関数を管理する目的で、いくつかのタイプのストライクに対して3つの関数を定義しました。ここでヘッダー:コンストラクタC++と関数パラメータへのポインタ

#ifndef PAYOFFb_H 
#define PAYOFFb_H 
#include <MinMax.h> 
class PayOff 
{ 
public: 
    typedef double (*pf)(const double& Strike, const double& Spot); 
    double Call(const double& Strike, const double& Spot){ return max(Spot - Strike, 0.0); }; 
    double Put(const double& Strike, const double& Spot){ return max(Strike - Spot, 0.0); }; 
    double Digital(const double& Strike, const double& Spot){ return Spot > Strike ? 1 : 0; }; 
    PayOff(double Strike_, pf TheOptionsType_) : Strike(Strike_), TheOptionsType(TheOptionsType_){}; 
    double operator()(double Spot) const; 
private: 
    double Strike; 
    pf TheOptionsType; 
}; 
#endif 

と身体:

#include "Payoff1b.h" 
#include <MinMax.h> 
double PayOff::operator()(double spot) const 
{ 
    return (*TheOptionsType)(Strike, spot); 
}; 

次メインのコード使用:

[...] error C2664: 'PayOff::PayOff(const PayOff &)' : cannot convert argument 1 from 'double' to 'const PayOff &' 

:私は、コンストラクタのために、このエラーが出る

int main() 
{ 
double Strike; 
cout << "\nEnter strike\n"; 
cin >> Strike; 
PayOff callPayOff(Strike, PayOff::Call); 
PayOff putPayOff(Strike, PayOff::Put); 
PayOff digitalPayOff(Strike, PayOff::Digital); 
return 0; 
} 

を私は親切に誰かが私に何を説明できるか尋ねる動作しない

+0

関連するエラーメッセージはないこと:

それはそのためにあなたはあなたのCallPutDigitalは静的である必要があり、第二の場合のように見えます。それらのすべてを投稿してみてください。 – aschepler

+0

これは、表示されていないコードに対応するエラーメッセージではなく、関連するエラーメッセージを表示した場合に役立ちます。コンストラクタが受け入れて格納するポインタは非メンバ関数です。提供される関数はメンバ関数です。それらは異なるものなので、コンパイラーが「メンバー関数へのポインター」を「非メンバー関数へのポインター」に変換しようとするとエラーが発生します。 – Peter

+0

ここではC++ 11はどこですか?コール/プット/デジタル静的関数を作成する必要がありますので、コンストラクタの引数としてそれらを入れることができます – Sklert

答えて

0

メンバ関数ポインタまたは正規関数ポインタを使用しようとしているのかどうかは不明です。

class PayOff 
{ 
public: 
    typedef double(*pf)(const double& Strike, const double& Spot); 
    static double Call(const double& Strike, const double& Spot) 
    { 
     return max(Spot - Strike, 0.0); 
    }; 
    static double Put(const double& Strike, const double& Spot) 
    { 
     return max(Strike - Spot, 0.0); 
    }; 
    static double Digital(const double& Strike, const double& Spot) 
    { 
     return Spot > Strike ? 1 : 0; 
    }; 
    PayOff(double Strike_, pf TheOptionsType_) : Strike(Strike_), TheOptionsType(TheOptionsType_) {}; 
    double operator()(double Spot) const; 
private: 
    double Strike; 
    pf TheOptionsType; 
}; 
+0

この場合、コンパイラが静的キーワードを必要としていることに気づいていませんでした。とにかく、私は通常の関数ポインタを探していたので、コードが動作しています。どうもありがとうございました。Pavel – aforgio

+0

@aforgio喜んで助けました。答えを受け入れることを忘れないでください – Pavel

関連する問題