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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вернуть объект при перегрузке бинарной операции, Возвращение объекта некоторого класса 
V
    Опции темы
nobody0
  Дата 20.2.2011, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот часть класса:
Код

class Polynomial
{
    unsigned int deg;
    int *coef;
public:
    Polynomial(int n = 0, char* str = "P", int c1 = 1) : deg(n) // конструктор
    {
        // создание объекта
    }
    Polynomial (const Polynomial & P, char* str = "P") // копирующий конструктор
    {
        // копирует данные объекта-параметра в создаваемый объект
    }
    Polynomial operator+ (const Polynomial &P)
    {
        // некоторые действия
        Polynomial R(degR);
        // некоторые действия
        return R;
    }


Вопрос: почему когда в функции, перегружаемой оператор +, возвращаемое значение просто R, то возвращается черти что, а если возвращать Polynomial( R ), т.е. возвращая копию этого объекта, все так, как и должно быть? 

P.S. Черт, я же хотел создать тему в форуме новичков... Если несложно, перенесите тему туда, пожалуйста.

Это сообщение отредактировал(а) nobody0 - 20.2.2011, 14:31
PM   Вверх
alexvs11
Дата 20.2.2011, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



nobody0, наверняка не скажу, но вот соображения
если делаете 
Код

        Polynomial R(degR);
        // некоторые действия
        return R;

то при return R; будет вызван конструктор копирования
если делать return Polynomial(degR) то конструктор копирования вызван не будет, вызовется только один конструктор
судя по всему проблема в конструкторе копирования
PM MAIL   Вверх
nobody0
Дата 20.2.2011, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(alexvs11 @ 20.2.2011,  14:36)
если делать return Polynomial(degR)

Так второй же вариант другой:
Код

return Polynomial( R);

Т.е. вызывается функция с переданным в нее объектом класса и возвращает тоже объект класса, т.е. копирует объект. И только в таком случае возвращается то, что нужно.

Это сообщение отредактировал(а) nobody0 - 20.2.2011, 14:46
PM   Вверх
kemiisto
Дата 20.2.2011, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

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



nobody0, таки покажите хотя бы свой конструктор копирования.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
nobody0
Дата 20.2.2011, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



kemiisto, 
Код

    Polynomial (const Polynomial & P, char* str = "P")
    {
        deg = P.deg;
        strcpy(name, str);
        coef = new int[deg + 1];
        for (unsigned int i = 0; i <= deg; ++i)
            coef[i] = P.coef[i];
    }


Но зачем он, если он работает верно? 
PM   Вверх
volatile
Дата 20.2.2011, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Небольшое уточнение.
Проблема не в конструкторе копирования, а в операторе копирования.
Нужно сделать нормальный оператор копирования
Код

const Polynomial& operator=(const Polynomial& v)
{
    //то что надо сделать для копирования  в *this из v
};

PM MAIL   Вверх
kemiisto
Дата 20.2.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

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



volatile, и как же оно по-твоему тогда "работает", если вернуть не X, а Polynomial(X)?

Нет, тут нужен весь код. Полностью. ТС что-то явно не договаривает...

Это сообщение отредактировал(а) kemiisto - 20.2.2011, 14:55


--------------------
PM MAIL WWW GTalk Jabber   Вверх
nobody0
Дата 20.2.2011, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



__

Это сообщение отредактировал(а) nobody0 - 23.3.2011, 20:03
PM   Вверх
volatile
Дата 20.2.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(kemiisto @  20.2.2011,  14:55 Найти цитируемый пост)
volatile, и как же оно по-твоему тогда "работает", если вернуть не X, а Polynomial(X)?

Polynomial a; 
Polynomial b;
Polynomial c = a + b; // здесь будет работать, так как будет вызван конструктор копирования, а не оператор копирования.

Цитата(kemiisto @  20.2.2011,  14:55 Найти цитируемый пост)
Нет, тут нужен весь код.


Согласен, нужен весь код.


PM MAIL   Вверх
nobody0
Дата 20.2.2011, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

так как будет вызван конструктор копирования


А я думал, что конструктор копирования используется таким образом:
Код

Polynomial A(B); 


У Вас, так понимаю, второй вариант его использования?

В любом случае, такая конструкция у меня не использована.



Это сообщение отредактировал(а) nobody0 - 20.2.2011, 15:08
PM   Вверх
alexvs11
Дата 20.2.2011, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



Цитата(volatile @  20.2.2011,  14:52 Найти цитируемый пост)
Нужно сделать нормальный оператор копирования

что, это оператор присваивания, а не копирования,
он тут не вызовется
PM MAIL   Вверх
volatile
Дата 20.2.2011, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Упс, вашего кода еще не смотрел. запостили пока писал.
Цитата(nobody0 @  20.2.2011,  14:57 Найти цитируемый пост)
почему в Вашем примере в начале строки стоит const?

Ну это мой стиль. smile  В принципе можно не использовать конст.

Добавлено @ 15:09
Цитата(nobody0 @  20.2.2011,  15:06 Найти цитируемый пост)
 я думал, что конструктор копирования используется таким образом:

код C++
1:

Polynomial A(B); 


Polynomial A(B); // конструктор  копирования, правильно!
Polynomial A = B; // тоже конструктор  копирования!


Это сообщение отредактировал(а) volatile - 20.2.2011, 15:11
PM MAIL   Вверх
nobody0
Дата 20.2.2011, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если что, вот часть того, что есть в главной функции программы:
Код

Polynomial P1(4, "P1"), P2(2,"P2");
P1.incoef(); P2.incoef(); // ввод коэффициентов
std::cout << P1+P2; // вывод суммы


Оператор вывода перегружен так:
Код

std::ostream& operator<< (std::ostream & out, const Polynomial &P) // Вывод полинома
{
    unsigned int e = P.get_deg();
    out << P.name << "(x)=";
    if (P[0] || !e) out << P[0];
    for (unsigned int i = 1; i <= e; ++i)
    {
        if ( P[i] > 0 ) out << '+';
        if ( P[i] == -1 ) out << "-x^" << i;
        else if ( P[i] == 1 ) out << "x^" << i;
        else if (P[i]) out << P[i] << "x^" << i;
    }
    out << '\n';
    return out;
}

Несколько недоработанных условий лишь для более корректного вывода в привычном виде.
PM   Вверх
mes
Дата 20.2.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(volatile @  20.2.2011,  14:07 Найти цитируемый пост)
Polynomial A(B); // оператор копирования, правильно!
Polynomial A = B; // тоже оператор копирования!

второе выражение является формой записи первого, в отличии от  "A = B;", где уже участвует оператор присваивания..

Добавлено через 1 минуту и 40 секунд
Цитата(nobody0 @  20.2.2011,  13:57 Найти цитируемый пост)
 но только пр возвращении есть ошибки (return R;).

может скажете и в чем заключается ошибочность результата ?




--------------------
PM MAIL WWW   Вверх
nobody0
Дата 20.2.2011, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



mes, 
...
на данный момент работает верно...
...
Очень странно.
Раньше были коэффициенты неверные — огромные числа. Неужели я что-то в коде функций менял...
Спасибо.
Тема может быть закрыта.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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