2017-04-15 77 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