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

Поиск:

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


Новичок



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

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



Программа служит для работы с большими целыми числами. Собираю из трёх файлов:

Код
// hugeint1.h
//определение класса HugeInt

#ifndef HUGEINT1_H
#define HUGEINT1_H
#include<iostream>

using namespace std;

class HugeInt
{
    friend ostream &operator<<(ostream &, HugeInt &);

public:
    HugeInt(long = 0); //конструктор преобразования
    HugeInt(const char *); //конструктор преобразования
    HugeInt operator+(HugeInt &); //перегрузка оператора сложения

private:
    short integer[30];
};

#endif

Код
// hugeint1.cpp
//Определение функций элементов и дружественных функций класса HugeInt

#include<iostream>
#include<string.h>
#include"hugeint1.h"

using namespace std;

//конструктор преобразования
HugeInt::HugeInt(long val)
{
    int i;
    for (i = 0; i <= 29; i++)
        integer[i] = 0; //задание массиву нулевых начальных значений

    for (i = 29; val != 0 && i >= 0; i--)
    {
        integer[i] = val % 10;
        val /= 10;
    }
}

//конструктор преобразования
HugeInt::HugeInt(const char *string)
{
    int i, j;

    for (i = 0; i <= 29; i++)
        integer[i] = 0;

    for (i = 30 - strlen(string), j = 0; i <= 29; i++, j++)
        integer[i] = string[j] - '0';
}

//перегрузка оператора сложения
HugeInt HugeInt::operator+(HugeInt &op2)
{
    HugeInt temp;
    int carry = 0;

    for (int i = 29; i >= 0; i--)
    {
        temp.integer[i] = integer[i] + op2.integer[i] + carry;

        if (temp.integer[i] > 9)
        {
            temp.integer[i] %= 10;
            carry = 1;
        }
        else
            carry = 0;
    }

    return temp;
}

//перегрузка оператора "поместить в поток <<"
ostream &operator<<(ostream &output, HugeInt &num)
{
    int i;

    for (i = 0; (num.integer[i] == 0) && (i <= 29); i++); //пропуск начальных нулей

    if (i == 30)
        output << 0;
    else
        for ( ; i<= 29; i++)
            output << num.integer[i];

    return output;
}

Код
/// task8_16.cpp
//проверка драйвера класса HugeInt

#include<iostream>
#include"hugeint1.h"

using namespace std;

int main()
{
    HugeInt n1 = 7654321, n2 = 7891234, n3 = "999999999999999999999999",
        n4 = "1", n5;

    cout << "n1 is equal " << n1 << endl
        << "n2 is equal " << n2 << endl
        << "n3 is equal " << n3 << endl
        << "n4 is equal " << n4 << endl
        << "n5 is equal " << n5 << endl << endl;

    n5 = n1 + n2;
    cout << n1 << " + " << n2 << " = " << n5 << endl << endl;

    cout << n3 << " + " << n4 << endl
        << "= " << n3 + n4 << endl << endl;

    n5 = n1 + 9;
    cout << n1 << " + " << 9 << " = " << n5 << endl << endl;

    n5 = n2 + "10000";
    cout << n2 << " + " << "10000" << " = " << n5 << endl << endl;

    return 0;
}


Пробую компилировать в MS Visual C++ 2008 Express Edition
Выводит следующие ошибки:

Цитата

------ Rebuild All started: Project: pic8_8, Configuration: Debug Win32 ------
Deleting intermediate and output files for project 'pic8_8', configuration 'Debug|Win32'
Compiling...
hugeint1.cpp
task8_16.cpp
d:\my laboratory\my projects\pic8_8\pic8_8\task8_16.cpp(19) : error C2679: binary '+' : no operator found which takes a right-hand operand of type 'long' (or there is no acceptable conversion)
        d:\my laboratory\my projects\pic8_8\pic8_8\hugeint1.h(16): could be 'HugeInt HugeInt::operator +(HugeInt &)'
        while trying to match the argument list '(HugeInt, long)'
d:\my laboratory\my projects\pic8_8\pic8_8\task8_16.cpp(27) : error C2679: binary '+' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
        d:\my laboratory\my projects\pic8_8\pic8_8\hugeint1.h(16): could be 'HugeInt HugeInt::operator +(HugeInt &)'
        while trying to match the argument list '(HugeInt, int)'
d:\my laboratory\my projects\pic8_8\pic8_8\task8_16.cpp(30) : error C2679: binary '+' : no operator found which takes a right-hand operand of type 'const char [6]' (or there is no acceptable conversion)
        d:\my laboratory\my projects\pic8_8\pic8_8\hugeint1.h(16): could be 'HugeInt HugeInt::operator +(HugeInt &)'
        while trying to match the argument list '(HugeInt, const char [6])'
Generating Code...
Build log was saved at "file://d:\My laboratory\My projects\pic8_8\pic8_8\Debug\BuildLog.htm"
pic8_8 - 3 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========


PM MAIL   Вверх
hsilgos
Дата 20.7.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

HugeInt HugeInt::operator+(const HugeInt &op2)


Добавлено через 1 минуту и 8 секунд
да, и сделай конструктор 
Код

HugeInt::HugeInt(int val)

если 64-битная платформа

Добавлено через 2 минуты и 45 секунд
Вопрос: Если класс для работы с большими числами, то зачем ограничивать массив 30-ю элементами? Не лучше ли использовать std::vector ?
PM MAIL   Вверх
wrathchildtoo
Дата 20.7.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(hsilgos @  20.7.2009,  22:16 Найти цитируемый пост)
Вопрос: Если класс для работы с большими числами, то зачем ограничивать массив 30-ю элементами? Не лучше ли использовать std::vector ?

Это всего лишь учебный пример на перегрузку операций, который я сейчас пытаюсь изучить.

Добавлено через 2 минуты и 27 секунд
Цитата(hsilgos @  20.7.2009,  22:16 Найти цитируемый пост)
да, и сделай конструктор код C++1:HugeInt::HugeInt(int val)highlightSyntax('cpp_lMTIzM','cpp');если 64-битная платформа

с таким коструктором абсолютно тоже-самое.
ЗЫ платформа 32-битная
PM MAIL   Вверх
jonie
Дата 21.7.2009, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
с таким коструктором абсолютно тоже-самое.

обратати внимание на то что тебе сказали:
Код

HugeInt HugeInt::operator+(const HugeInt &op2)
вы упустили const из виду - компилятор может делать только константные преобразования неявно, в противном случае есть вероятность что вы потеряете данные не зная об этом...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
wrathchildtoo
Дата 21.7.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(jonie @  21.7.2009,  07:09 Найти цитируемый пост)
вы упустили const из виду - компилятор может делать только константные преобразования неявно, в противном случае есть вероятность что вы потеряете данные не зная об этом...

О, чудо! Всё заработало. Буду иметь в виду.
Спасибо откликнувшимся.
PM MAIL   Вверх
maxmaslyuk
Дата 1.7.2012, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет, всем! Друзья, не могли бы вы помочь с подобной задачей. Условие такое же, но только нужно имплементировать вот такой вот конструктор 
Код
HugeInt( const short [] );


чтобы можно было осуществить вот, собственно, вот это 
Код

long a[] = {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9};
    long b[1];
    long c[] = {1,0,0,0,0};
    b[0] = 1;
    HugeInt n3( a ), n4( b );

cout << n3 << " + " << n4 << "\n= " << ( n3 + n4 )
    << "\n\n";



Заранее спасибо за помощь! smile

Это сообщение отредактировал(а) maxmaslyuk - 1.7.2012, 03:43
PM MAIL   Вверх
xvr
Дата 1.7.2012, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(maxmaslyuk @  1.7.2012,  01:59 Найти цитируемый пост)
Условие такое же, но только нужно имплементировать вот такой вот конструктор 

Ну так и имплементируйте. Вот только размер массива придется передать явно, не умеет С++ размеры массивов вычислять, если не видно самого массива

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


Эксперт
****


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

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



Цитата(xvr @  1.7.2012,  18:40 Найти цитируемый пост)
не умеет С++ размеры массивов вычислять, если не видно самого массива

ну здесь-то массивы видны
нужно просто не давать им превращаться в указатели
как-то так:
Код

template<typename T,int Count>HugeInt(T(&array)[Count]);


Это сообщение отредактировал(а) maxim1000 - 2.7.2012, 17:55


--------------------
qqq
PM WWW   Вверх
math64
Дата 3.7.2012, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(maxim1000 @  2.7.2012,  17:55 Найти цитируемый пост)
нужно просто не давать им превращаться в указатели
как-то так:
Код
template<typename T,int Count>HugeInt(T(&array)[Count]);

Ну и для каждого Count сгенерится отдельный конструктор с почти идентичным кодом - нерациональное использование памяти.
PM   Вверх
maxim1000
Дата 3.7.2012, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(math64 @  3.7.2012,  08:20 Найти цитируемый пост)
Ну и для каждого Count сгенерится отдельный конструктор с почти идентичным кодом - нерациональное использование памяти. 

если они все будут вызывать что-то вроде "Init", с большой вероятностью, всё встроится в момент вызова.

Впрочем, решать эту проблему нужно только после измерений ;)


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

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

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

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

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


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

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


 




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


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

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