2016-12-16 6 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

это зависит от того, А, и будет ли "вызова" один делает для читаемым повествования. Вас может заинтересовать этот ответ: 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; 
}