Форум программистов, компьютерный форум CyberForum.ru

функция для класса Vector - C++

Восстановить пароль Регистрация
 
biruld
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 12
16.12.2013, 14:43     функция для класса Vector #1
я написала класс полиномов 4й степени, сделала по нему калькулятор - все работает. создала класс вектор для объектов класса полином - выдает ошибку. с закомменченной функцией инсерт - работает. что не так? функция инсерт должна вставлять элемент в начало массива.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
class Vector
{
    Polinom *v;
    int dlina;
public:
    Vector (int N=0): v(0), dlina(0)
    {
        if (N>0) v=new Polinom [N];
        if (v) dlina=N;
    }
    ~Vector()
    {
        delete []v;
    }
    Vector (const Vector &temp): v(0), dlina(0) //конструктор копирования
    {
        if (temp.dlina>0) v=new Polinom [temp.dlina];
        if (v)
        {
            dlina=temp.dlina;
            for (int i=0; i<dlina; i++)
            {
                v[i]=temp.v[i];
            }
        }
    }
 
    int size(Vector R) const {return R.dlina;}//размерность
    Polinom &operator [] (int index)// перегрузка оператора [] в левой части присваивания
    {
        return v[index];
    }
    Polinom operator [] (int index) const//перегрузка оператора [] в правой части присваивания
    {
        return v[index];
    }
    friend Vector insert (Polinom temp, Vector R);
};
    Vector insert (Polinom temp, Vector R)//добавляет элемент в начало массива
    {
        Polinom *k;
        k = new Polinom [R.dlina+1];//создает новый массив
        k[0]=temp;//сохраняет в первый элемент
        for (int i=1; i<R.dlina+1; i++)//переписываем остальные
        {
            k[i]=R.v[i-1];
        }
        delete [] R.v;//удаляем существующий массив v
        R.v = new Polinom [R.dlina+1];//создаем новый который содержит на 1 элемент больше
        for (int i=0; i<R.dlina+1; i++)//копируем все элементы из к в v
        {
            R.v[i]=k[i];
        }
        delete [] k;
        return R;
    }
 
void main()
{
    Vector a(10);
    for (int i=0; i<10; i++)
    {
    cout<<"Vvedite "<<i<<" element/n";
    cin>>a[0];
    }
    Polinom temp;
    cin>>temp;
    a = insert (temp, a);
    for (int i=0; i<11; i++)
    {
        cout<<a[i];
        cin>>"/n";
    }
    _getch();
}
Добавлено через 18 минут
помогите пожааалуйста! задолбалась искать, может кто нибудь свежим взшлядом глянет и найдет...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.12.2013, 14:51     функция для класса Vector #2
biruld, Что есть ошибка?
Demy85
58 / 58 / 5
Регистрация: 28.05.2012
Сообщений: 211
Завершенные тесты: 1
16.12.2013, 15:00     функция для класса Vector #3
У меня ошибок не выдает, но мне кажется, что код делает не то что было задумано изначально. Начнем по порядку. Что делает этот кусок кода:
C++
1
2
3
4
5
6
Vector a(10);
    for (int i=0; i<10; i++)
    {
    cout<<"Vvedite "<<i<<" element/n";
    cin>>a[0]; // ????????
    }
Тут две ошибки:
1 - заполняется один и тот же элемент полинома;
2 - элемент этот не заполняется так как для ввода передается ссылка.
biruld
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 12
16.12.2013, 15:46  [ТС]     функция для класса Vector #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void main()
{
    Vector a(3);
    for (int i=0; i<3; i++)
    {
    cout<<"Vvedite "<<i<<" element\n";
    cin>>a[i];
    }
    cout<<a[0]; /*на этом этапе все хорошо*/
    Polinom temp;
    cin>>temp;
    a = insert (temp, a);
    for (int i=0; i<4; i++)
    {
        cout<<a[i]; /*а вот здесь начинает выдавать какую-то фигню с 6.28842е+303 что-то такое*/
        cout<<"\n";
    }
    _getch();
}
Добавлено через 1 минуту
ой, это очепятка должно быть - a[i]. не заметила ошибки просто потому что программа не запускается((

аха-ха. нашла ошибку. \n - надо как бы выводить а не вводить) но все равно выдает фигню какую-то!

Добавлено через 4 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
biruld, Что есть ошибка?
ошибку исправила, тупая ошибка) тем не менее, работает не так, как я хочу. посмотрите, пожалуйста, сообщение ниже
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.12.2013, 15:51     функция для класса Vector #5
biruld, Я не знаю, что есть
работает не так, как я хочу
. Пустые слова.
Функция insert несколько странно написано. Непонятно почему она friend, непонятно почему она принимает копию и возвращает копию и как минимум ее можно сократить до
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    Vector insert (Polinom temp, Vector R)//добавляет элемент в начало массива
    {
        Polinom *k;
        k = new Polinom [R.dlina+1];//создает новый массив
        k[0]=temp;//сохраняет в первый элемент
        for (int i=1; i<R.dlina+1; i++)//переписываем остальные
        {
            k[i]=R.v[i-1];
        }
        delete [] R.v;//удаляем существующий массив v
        R.v = k;
        return R;
    }
Ибо копирование два раза предельно бессмысленно.
Demy85
58 / 58 / 5
Регистрация: 28.05.2012
Сообщений: 211
Завершенные тесты: 1
16.12.2013, 15:52     функция для класса Vector #6
Цитата Сообщение от biruld Посмотреть сообщение
ошибку исправила, тупая ошибка) тем не менее, работает не так, как я хочу. посмотрите, пожалуйста, сообщение ниже
Обычно если переопределяешь конструктор копирования, то необходимо также переопределить оператор присваивания. Как то так...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Vector &operator =(const Vector &temp)
{
    if (v != NULL) delete[] v;
    if (temp.dlina>0) v=new Polinom [temp.dlina];
    if (v)
    {
        dlina=temp.dlina;
        for (int i=0; i<dlina; i++)
        {
            v[i]=temp.v[i];
        }
    }
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.12.2013, 15:53     функция для класса Vector #7
Demy85,
C++
1
if (v != NULL) delete[] v;
Бесполезная проверка. Если вызвать delete[] на NULL ничего плохого не произойдет.
Demy85
58 / 58 / 5
Регистрация: 28.05.2012
Сообщений: 211
Завершенные тесты: 1
16.12.2013, 15:57     функция для класса Vector #8
Цитата Сообщение от ForEveR Посмотреть сообщение
Функция insert несколько странно написано. Непонятно почему она friend, непонятно почему она принимает копию и возвращает копию и как минимум ее можно сократить до
Тут все странно написано, например в функцию insert vector можно передавать по константной ссылке.
C++
1
Vector insert (Polinom temp, const Vector &R)
Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
Бесполезная проверка. Если вызвать delete[] на NULL ничего плохого не произойдет.
Я привык подстраховываться.
biruld
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 12
16.12.2013, 16:10  [ТС]     функция для класса Vector #9
просто я очень сильно начинающий ) спасибо! щас все попробую

Добавлено через 5 минут
Цитата Сообщение от Demy85 Посмотреть сообщение
Обычно если переопределяешь конструктор копирования, то необходимо также переопределить оператор присваивания. Как то так...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Vector &operator =(const Vector &temp)
{
    if (v != NULL) delete[] v;
    if (temp.dlina>0) v=new Polinom [temp.dlina];
    if (v)
    {
        dlina=temp.dlina;
        for (int i=0; i<dlina; i++)
        {
            v[i]=temp.v[i];
        }
    }
}
Vector operator must return a value, говорит
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.12.2013, 16:19     функция для класса Vector #10
biruld, Добавьте там return *this; в конце.
biruld
0 / 0 / 0
Регистрация: 16.12.2013
Сообщений: 12
16.12.2013, 16:26  [ТС]     функция для класса Vector #11
спасибо! все, просто надо было со ссылкой работать а не со значением. работает!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2013, 16:55     функция для класса Vector
Еще ссылки по теме:

Как корректно скопировать vector в vector внутри класса C++
Деструктор для абстрактного класса, использующего static vector C++
Возврат vector из класса C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Demy85
58 / 58 / 5
Регистрация: 28.05.2012
Сообщений: 211
Завершенные тесты: 1
16.12.2013, 16:55     функция для класса Vector #12
Цитата Сообщение от biruld Посмотреть сообщение
просто я очень сильно начинающий ) спасибо! щас все попробую
Давай разберем кусок кода:
C++
1
2
3
4
5
6
7
............
    Polinom &operator [] (int index)// перегрузка оператора [] в левой части присваивания
    {
        return v[index];
    }
............
    cin >> a[i];
1. Оператор индексации передает адрес элемента с заданным индексом.
2. Метод cin.operator >>(type &value) берет ссылку от значения переданного ранее a.operator[], то есть ссылку на ссылку, и помещает туда значение введенное пользователем.
Вопрос: что будет содержать a[i]? Правильно!!! Ничего!!! Вернее мусор. Надо так:
C++
1
2
3
4
5
.........
Polinom t;
cin >> t;
a[i] = t;
........
Добавлено через 8 минут
Цитата Сообщение от biruld Посмотреть сообщение
Vector operator must return a value, говорит
Да, забыл про return *this.
Yandex
Объявления
16.12.2013, 16:55     функция для класса Vector
Ответ Создать тему
Опции темы

Текущее время: 10:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru