Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2012, 00:41   #1
InKo1
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 18
По умолчанию Некорректная работа класса

функция length() не работает внутри копирующего конструктора, некорректно работает оператор +

Код:
#include<iostream>

using namespace std;

class veryLongInt
    {
        public:
            veryLongInt();
            veryLongInt(int x);
            veryLongInt(const veryLongInt& s);
            int length() const;
            void out() const
                {
                    for(int i = 0; i < 20; i++)
                        cout << m[i];
                }
            int operator[](int i) const
                {
                    return m[i];
                }
            int& operator[](int i)
                {
                    return m[i];
                }
            veryLongInt operator+(veryLongInt& s);
        private:
            int k;
            int m[19];
            void init()
                {
                    for(int i = 0; i < 20; i++)
                        m[i] = 0;
                    k = 0;
                }
    };

veryLongInt::veryLongInt()
    {
        init();
    }

veryLongInt::veryLongInt(int x)
    {
        init();
        int i = 19;
        do
            {
                m[i] += x % 10;
                i--;
                k++;
            } while((x /= 10) > 0);
    }

veryLongInt::veryLongInt(const veryLongInt& s)
    {
        init();
        k = s.length(); // возвращает 0
        for(int i = 19 - k + 1; i < 20; i++)
            m[i] = s[i];
    }

int veryLongInt::length() const
    {
        return k;
    }

veryLongInt veryLongInt::operator+(veryLongInt& s)
    {
        veryLongInt _new;
        int buf = 0;
        for(int i = 19; i >= 0; i--)
            {
                if(buf != 0)
                    {
                        _new[i] += buf;
                        buf = 0;
                    }
                _new[i] += s[i] + this -> m[i];
                if(_new[i] > 9)
                    {
                        buf = _new[i] - 10;
                        _new[i] -= 10;
                    }
            }
        return _new;
    }

int main()
    {
        veryLongInt x(32);
        veryLongInt y(12);
       // veryLongInt z = x + y; всё прекрасно работает
/* veryLongInt z;
z = x + y; перестаёт работать
cout << x[19]; должно вывести 2, а выводит 0, в вышестоящем случае выводит 2
*/
        return 0;
    }
InKo1 вне форума Ответить с цитированием
Старый 23.12.2012, 01:34   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

У Вас в operator+ не вычисляется k для _new. То есть оно остаётся равным нулю.
netrino вне форума Ответить с цитированием
Старый 23.12.2012, 01:37   #3
InKo1
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 18
По умолчанию

Я это знаю, поэтому пока никак не использую k в программе, проблема никак не в k
InKo1 вне форума Ответить с цитированием
Старый 23.12.2012, 01:58   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

k здесь имеет непосредственное отношение к Вашей проблеме, взгляните
Код:
veryLongInt::veryLongInt(const veryLongInt& s)
    {
        init();
        k = s.length(); // возвращает 0
        for(int i = 19 - k + 1; i < 20; i++)
            m[i] = s[i];
    }
Так как k == 0, а начальное i равно 19 - 0 + 1 == 20, то цикл не выполнится ни единого разу, вследствие чего данные скопированы не будут. В случае
Код:
veryLongInt z = x + y;
работает, потому что, благодаря оптимизациям компилятора, копирующий конструктор в этом куске кода не вызывается, но в таком случае:
Код:
veryLongInt z;
z = x + y;
может быть вызван копирующий конструктор

Последний раз редактировалось netrino; 23.12.2012 в 02:02.
netrino вне форума Ответить с цитированием
Старый 23.12.2012, 02:02   #5
InKo1
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 18
По умолчанию

Блин, как сразу не дошло, спасибо большое
InKo1 вне форума Ответить с цитированием
Старый 23.12.2012, 02:04   #6
InKo1
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 18
По умолчанию

функция length() работет некорректно даже в таком случае:
Код:
veryLongInt x(32);
veryLongInt y(x);
InKo1 вне форума Ответить с цитированием
Старый 23.12.2012, 02:17   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А у Вас массив недостаточных размеров для используемых индексов (так как массив размером 19, то максимальный индекс - 18). Измените размер массива на 20. По всей видимости, init y, вылезая за пределы массива m, затирает первое поле (int k) переменного x.

Надо заметить, что Ваш копирующий конструктор излишен в данном случае, стандартный справится ничуть не хуже (даже лучше). Тем не менее, если впоследствии планируется добавить под управление экземпляра класса внешние данные (например, выделенные в куче), то помимо копирующего конструктора необходимо также определить копирующее присваивание
Код:
veryLongInt &operator= (const veryLongInt& s)  {
// ...
}

Последний раз редактировалось netrino; 23.12.2012 в 02:19.
netrino вне форума Ответить с цитированием
Старый 23.12.2012, 02:31   #8
InKo1
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 18
По умолчанию

Спасибо, всё работает
InKo1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Некорректная работа программы Starget-93 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 18.11.2012 06:08
Некорректная работа сайта. t1umxo PHP 5 09.10.2012 13:17
Некорректная работа кода [C++] madmaniac Помощь студентам 1 10.03.2012 15:50
Некорректная работа WPF _-Re@l-_ WPF, UWP, WinRT, XAML 0 19.04.2011 16:05
Некорректная работа с файлами Gapro Общие вопросы Delphi 13 24.03.2011 08:39