C++中的运算符()
operator() in C++
我有一个对象,它后面有一个数学函数。它似乎是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++风格的类型转换,会让你觉得更迂腐,之后你就不会被它困扰了。
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 如何防止clang格式在流运算符调用之间添加换行符<<