Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с перегрузкой оператора = 
V
    Опции темы
Antarn
Дата 7.12.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 11.8.2006

Репутация: нет
Всего: нет



Здравствуйте.

Объясните, в чем ошибка перегрузки оператора = с параметром char ?
Код

class A
{
public:
    int field;

    A()
    {
        field = 0;
    }

    A& operator = (A& obj)
    {
        this->field = obj.field;

        return *this;
    }

    A& operator = (char c)
    {
        this->field = 10;

        return *this;
    }
    
};

class B:public A
{
    int field2;
};

void main()
{
    B obj, obj2;

    obj = obj2;

    obj = 'c';
}


Первый перегруженный оператор для 
Код

obj = obj2;

успешно вызывается.

На 
Код

obj = 'c';

Выдает ошибку
Цитата

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'char' (or there is no acceptable conversion)

В чем проблема ?
PM MAIL   Вверх
Annihilator
Дата 7.12.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Цитата(Antarn @  7.12.2008,  22:52 Найти цитируемый пост)

Первый перегруженный оператор для 
   
obj = obj2;

успешно вызывается.

 С чего ты взял, что вызывается именно перегруженный оператор? Это вызывается оператор присваивания по умолчанию, который создают побитовые копии объектов (не веришь - пройдись дебаггером). А проблема вся в том что ты перегрузил операторы для класса A, а пытаешься их использовать для класса B

Это сообщение отредактировал(а) Annihilator - 7.12.2008, 20:03


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
J0ker
Дата 7.12.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



операторы, конструкторы и деструкторы не наследуются
в первом случае вызывается оператор предка и дефолтный shallow-copy operator=
и надо писать так:
Код

A& operator=(const A& obj)


Добавлено @ 20:06
Цитата(Annihilator @  7.12.2008,  20:02 Найти цитируемый пост)
который создают побитовые копии объектов

побитовые копии только для PODS
для классов вызывается operator= для предка и каждого мембера класса

Это сообщение отредактировал(а) J0ker - 7.12.2008, 20:27


--------------------
user posted image
PM MAIL   Вверх
Antarn
Дата 7.12.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 11.8.2006

Репутация: нет
Всего: нет



Цитата("Annihilator")

 С чего ты взял, что вызывается именно перегруженный оператор?

Добавил в перегрузку cout и смотрел в консоль smile

Цитата("J0ker")

в первом случае вызывается оператор предка и дефолтный shallow-copy operator=

По аналогии подумал что также вызовется оператор предка (для первого же вызвал).

Спасибо за ответы  smile 
PM MAIL   Вверх
Annihilator
Дата 7.12.2008, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Цитата(J0ker @  8.12.2008,  00:02 Найти цитируемый пост)
побитовые копии только для PODS
для классов вызывается operator= для предка и каждого мембера класса

А можно, пожалуйста, кодом проиллюстрировать. Пока не очень въехал (различия POD и не-POD знаю)


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
J0ker
Дата 7.12.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(Annihilator @ 7.12.2008,  21:04)
Цитата(J0ker @  8.12.2008,  00:02 Найти цитируемый пост)
побитовые копии только для PODS
для классов вызывается operator= для предка и каждого мембера класса

А можно, пожалуйста, кодом проиллюстрировать. Пока не очень въехал (различия POD и не-POD знаю)

Код

class A
{
public:
    A &operator=(const A &aa) {
        cout << "A=" << endl;
        return *this;
    }
};


class C
{
public:
    C &operator=(const C &a) {
        cout << "C=" << endl;
        return *this;
    }
};

class B: public A
{
public:
    C c;
};



B b1, b2;
b1 = b2;



Это сообщение отредактировал(а) J0ker - 7.12.2008, 23:05


--------------------
user posted image
PM MAIL   Вверх
Antarn
Дата 7.12.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 11.8.2006

Репутация: нет
Всего: нет



Вопрос вдогонку - как вызвать оператор перезагрузки класса А из метода перезагрузки класса B ?

Я сделал так:
Код

    B& operator = (char c)
    {
        A::operator=(c);

        return *this;
    }

Но правильно ли это ? Не может ли наследник класса А вызывать его как-то по-другому ?
PM MAIL   Вверх
J0ker
Дата 8.12.2008, 03:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(Antarn @  7.12.2008,  23:05 Найти цитируемый пост)
Я сделал так:

ну все прально


--------------------
user posted image
PM MAIL   Вверх
Kallikanzarid
Дата 8.12.2008, 08:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: 2
Всего: 3



Antarn, можно проще:

Код

class B {
public:
    using A::operator=;
};

PM MAIL   Вверх
UnrealMan
Дата 8.12.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(J0ker @  7.12.2008,  20:02 Найти цитируемый пост)
операторы, конструкторы и деструкторы не наследуются

Страуструп не прав smile - оператор присваивания наследуется.
PM MAIL   Вверх
J0ker
Дата 8.12.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(UnrealMan @ 8.12.2008,  12:56)
Цитата(J0ker @  7.12.2008,  20:02 Найти цитируемый пост)
операторы, конструкторы и деструкторы не наследуются

Страуструп не прав smile - оператор присваивания наследуется.

так-же как конструкторы и деструкторы  smile 
иначе мне твоя мысль не ясна

Добавлено через 8 минут и 27 секунд
Цитата(J0ker @  7.12.2008,  20:02 Найти цитируемый пост)
операторы, конструкторы и деструкторы не наследуются

о, вот тут упс
операторы присваивания имелось ввиду


--------------------
user posted image
PM MAIL   Вверх
UnrealMan
Дата 8.12.2008, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(J0ker @  8.12.2008,  17:54 Найти цитируемый пост)
иначе мне твоя мысль не ясна

Цитата(10/1)
The base class members are said to be inherited by the derived class.

Цитата(13.5/6)
Operator functions are inherited in the same manner as other base class functions.

Если моя мысль тебе до сих пор не ясна, попробуй, руководствуясь стандартом, выяснить, является ли класс D в примере ниже

Код
struct B
{
    virtual B &operator =(const B &) = 0;
};

struct D : B
{
};

struct DD : D
{
    virtual B &operator =(const B &) { return *this; }
    void f() {}
};

int main()
{
    DD dd;
    D &rd = dd;
    dynamic_cast<DD &>(rd).f(); // well-formed only if D is polymorphic
    D d;                        // ill-formed if D is abstract
}

1) полиморфным
2) абстрактным.
PM MAIL   Вверх
J0ker
Дата 9.12.2008, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(UnrealMan @  8.12.2008,  23:07 Найти цитируемый пост)
1) полиморфным

да

Цитата(UnrealMan @  8.12.2008,  23:07 Найти цитируемый пост)
2) абстрактным. 

да

потерто потерто потерто


все понял
спасибо  smile 
полностью с тобой согласен
был не прав

ЗЫЖ то, что потер - не въехал, что implicit оператор присваивания скрывает все остальные - отсюда и кажущаяся разность поведения  smile 

Это сообщение отредактировал(а) J0ker - 9.12.2008, 03:22


--------------------
user posted image
PM MAIL   Вверх
J0ker
Дата 9.12.2008, 03:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(Antarn @ 7.12.2008,  18:52)
Здравствуйте.

Объясните, в чем ошибка перегрузки оператора = с параметром char ?
Код

class A
{
public:
    int field;

    A()
    {
        field = 0;
    }

    A& operator = (A& obj)
    {
        this->field = obj.field;

        return *this;
    }

    A& operator = (char c)
    {
        this->field = 10;

        return *this;
    }
    
};

class B:public A
{
    int field2;
};

void main()
{
    B obj, obj2;

    obj = obj2;

    obj = 'c';
}


Первый перегруженный оператор для 
Код

obj = obj2;

успешно вызывается.

На 
Код

obj = 'c';

Выдает ошибку
Цитата

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'char' (or there is no acceptable conversion)

В чем проблема ?

в связи с поправкой UnrealMan'a  smile 

operator= наследуется, но при отсутствии operator= в классе наследника существует implicit operator=, который и скрывает унаследованный
пример:

Код

struct B
{
    void foo(char c) {}
};

struct D: B
{
    void foo() {}
};

int main()
{
    D d;
    d.foo('A');

    return 0;
}


Это сообщение отредактировал(а) J0ker - 9.12.2008, 03:46


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1071 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.