C++中的运算符()

operator() in C++

本文关键字:运算符 C++      更新时间:2023-10-16

我有一个对象,它后面有一个数学函数。它似乎是operator()的完美候选者。

具体来说,它是一个光,对于球体上的每个(phi,theta(位置都有不同的值。

现在的问题是,当在类内部时,访问light函数有这样一个糟糕的语法:

二重运算符(((二重phi,二重theta({//计算灯光函数return sin(2*t(*cos(p(;//(实际上,这被实现为函数指针,//从而可以改变灯光功能(}void函数ThatUsesLightFunction(({双val=(2.0,4.0(//看起来很糟糕//哇!不起作用。双val2=(*this((2.0,4.0(//好double val3=运算符(((2.0,4.0(//不,谢谢}

但从类外,它得到了像这样非常好的语法

foreach(0..PI上的θ(foreach(0..2*PI上的phi(val+=光(θ,phi(

你认为我在这里滥用operator()吗?

我认为你应该在类的私有部分定义另一个函数,比如calculate,并从operator()和其他成员函数中调用这个函数。这样,就不会从成员函数调用operator(),但仍然可以从类外调用它。类似这样的东西:

class Light
{
  private:
    double calculateLight( double phi, double theta )
    {
        return sin(2*t) * cos(p) ;
    }
  public:
    double operator() ( double phi, double theta )
    {      
         return calculateLight(phi, theta);
    }
  //...
    void functionThatUsesLightFunction()
    {
         double val3 = calculateLight( 2.0, 4.0 );
    }
};
//Outside the class
Light light;
//...
val += light( theta, phi ) ;

添加calculateLight函数还有一个很好的优势,因为您可以为该函数选择一个好的名称,这增加了可读性。operator()没有增加可读性。

我不明白你为什么要在这里使用operator()。您不访问operator()主体中的任何对象字段,也不更改对象状态。我宁愿创建一个静态方法,或者只创建一个正则函数。。。

YourClass::operator()a.operator() (arguments)中与a(arguments)相比非常好。这只是一个习惯的问题。使用它一段时间,再加上C++风格的类型转换,会让你觉得更迂腐,之后你就不会被它困扰了。