2011-09-08 3 views
3
class A 
{ 
public: 
    A (unsigned _a) : a (_a) 
    { 
    } 
    operator unsigned&() 
    { 
     return a; 
    } 
    operator const unsigned() const 
    { 
     return a; 
    } 
    unsigned a; 
}; 

В приведенном выше примере я создал два оператора преобразования типа, один дает ссылку, один дает копию. У обоих есть свои недостатки. Любое предложение?Какова наилучшая практика перегрузки преобразования типов?


Поскольку оператор преобразования типов разрешен на C++, как мы можем наилучшим образом его использовать и где?

+1

Если вы 'оператор без знака()' сопзЬ (т.е. 'оператор без знака() const'), то вы можете (и должны) иметь и другое. – ildjarn

+2

, пожалуйста, также убедитесь, что вы достаточно читаете онлайн-материал, рассказывающий, почему его плохая идея имеет оператор преобразования (они не называются «литой оператор» с момента его преобразования, а не отбрасывания, и нет, нет такой вещи, как " imcit cast ") – PlasmaHH

ответ

3

Как сделать второй вариант const, так как вы все равно возвращаете копию. Это устранит неоднозначность:

class A 
{ 
public: 
    A (unsigned _a) : a (_a) 
    { 
    } 
    operator unsigned&() 
    { 
     return a; 
    } 
    operator unsigned() const // make this one const 
    { 
     return a; 
    } 
    unsigned a; 
}; 
+0

Я думаю, это работает, но это лучшая практика? –

+0

Лучшей практикой является, вероятно, не перегрузка этих операторов, если нет насущной необходимости. Это определенно не то, что вы делаете ", потому что это было бы удобно для вызывающего". – UncleBens

Смежные вопросы