2017-04-15 76 views
0

我對如何在C++ 11中定義一個具有參數指向函數的指針的構造有一些疑問。我創建了類Payoff來管理不同類型的給予罷工和現貨價格的期權。我還爲幾種類型的罷工定義了三個函數,具有相同的結構(參數和返回類型)和一個指向函數的指針,目的是管理這些相似的函數。這裏頭:構造函數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); 
}; 

使用下面的主要代碼:

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; 
} 

我得到這個錯誤的構造函數:

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

我懇請問,如果有人能解釋我是什麼樣的無法工作

+0

這不是相關的錯誤信息。嘗試發佈所有這些。 – aschepler

+0

如果您顯示與您未顯示的代碼相對應的相關錯誤消息,這將有所幫助。構造函數接受和存儲的指針是非成員函數。提供的功能是成員函數。它們是不同的東西,因此編譯器試圖將「指向成員函數的指針」轉換爲「指向非成員函數的指針」時出錯。 – Peter

+0

你在哪裏使用C++ 11?你需要使函數調用/放置/數字靜態,所以你將能夠把它們作爲構造函數的參數 – Sklert

回答

0

不清楚您是否嘗試使用成員函數指針或常規函數指針。

它看起來像第二種情況,對於您需要CallPutDigital是靜態的:

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

我不知道在這種情況下,編譯器需要static關鍵字。無論如何,我正在尋找一個常規函數指針,現在代碼正在工作。非常感謝,Pavel – aforgio

+0

@aforgio很高興幫助。不要忘記接受答案 – Pavel