2016-12-16 104 views
1

我目前正在重构了一些代码,不知道函数是在以下(即分配到返回引用的函数)实际上是不好的风格(至少它看起来怪异):分配到返回参考

#include <iostream> 

class A{ 
    public : 
     double & operator()() { 
      return this->x; 
     }; 

     double operator()() const{ 
      return this->x; 
     }; 

    protected : 
     double x = 0.0; 
}; 

int main(){ 
    A a; 
    a() = 4.0; 
    std::cout<<a()<<std::endl; //prints 4.0 as expected. 
}; 

这背后的背景是,我有一些代码,并行和使用类似的工作原理:

A.d 

根本就不是一个选项,而:

A() 

会工作,因为我可以将选择的内存留给一个函数。

(我知道的编码风格是有些主观的问题,但我是一个科学家,而不是一个软件工程师和良好做法给予反馈)

+0

这取决于什么A是,是否 “调用” 一个使一个可读的故事。您可能对此答案感兴趣:http://stackoverflow.com/questions/41149115/is-overloading-operator-for-a-reconstruction-a-good-practice/41150295#41150295 –

回答

4
a() = 4.0; 

这是不是真的不好的做法。每次你正在做的事情相当于取消引用容器:

a[i] = 4.0; 

这里operator[]返回一个参考,而你分配它。

operator()在这里可能不是更具可读性的选择。根据代码的情况下,像operator*可能是一个更好的选择,但是这是见仁见智的问题;)

#include <iostream> 

class A{ 
    public : 
     double & operator*() { 
      return this->x; 
     } 

     double operator*() const{ 
      return this->x; 
     } 

    protected : 
     double x = 0.0; 
}; 

int main(){ 
    A a; 
    *a = 4.0; 
    std::cout<<(*a)<<std::endl; //prints 4.0 as expected. 
}; 

double & operator()() { 
    return this->x; 
}; 

注意,定义,当你不需要尾随;功能。这样做:

class A{ 
    // ... 
    double & operator()() { 
     return this->x; 
    } 
    // ... 
}; 

或者:

class A{ 
    // ... 
    double & operator()(); 
    // ... 
}; 

double & A::operator()() { 
    return this->x; 
}