Операторы преобразования C ++ - PullRequest
1 голос
/ 03 июля 2011

Я знаю сделку. Компилятор пытается преобразовать один объект в тип других объектов с помощью оператора преобразования. Два способа сделать это. Конструктор (преобразовывает класс в другой) или оператор преобразования. Так что этот это просто проверить, если я в полной мере с концепциями. Код ниже дает ошибку

using namespace std ;
class A
{
    int i ;
    public:
            A(int a=0){this->i=a;}
            A operator+(const A& b){
                    A c ;
                    return c(this->i+b.i);
            }
            void show()
            {
                    cout<<i<<endl;
            }
 };
int main()
{
    A a1(1),a2(2),a3;
    a3=a2+a1;
    a3.show();
    return 0;
 }

Я предполагаю, что ошибка в операторе +. Когда я пытаюсь присвоить A (i). Нет никакого соответствия для оператора, который мог бы создать A из целого.

Но потом я вижу, что за этим скрывается конструктор A. Он может конвертировать int в A. Предположим, он конвертирует int в A. Затем, вызов становится A (B). Это эквивалентно конструктору копирования. Следовательно, этот вызов должен работать. Но это не так. В целом, я довольно запутался.

Пожалуйста, помогите.

1 Ответ

7 голосов
/ 03 июля 2011

В этих двух строках вы говорите компилятору создать объект A с помощью конструктора по умолчанию, затем вызвать его несуществующий оператор () (int) и вернуть его возвращаемое значение:

                A c ;
                return c(this->i+b.i);

Использовать либо

A c(i + b.i);
return c;

или

return A(i + b.i);

Кстати, пример для оператора неявного преобразования, для вашего класса:

operator int () const
{
    return i;
}

Но их использование пахнет плоходизайн, и может вызвать плохие вещи, такие как неявное преобразование в bool или указатель.Вместо этого используйте что-нибудь другое, например int toInt () const функцию-член.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...