0 / 0 / 0
Регистрация: 02.10.2019
Сообщений: 5
1

Вывод класса с шаблонами

16.05.2020, 12:47. Показов 666. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,пытаюсь научится писать на cpp и сейчас столкнулся с такой проблемой:
При попытке вывода массива, который находится в классе a, ostream& operator<<(ostream& os, const CMass<T>& a) не может получить верное значение a.index, а вместо этого получает -858993460. Но при этом значение a.size он получает правильное.
Почему так происходит и как это исправить ?
файл main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include "mass.h";
using namespace std;
int main()
{
    cout << fixed;
    srand(time(0));
    setlocale(LC_ALL, "rus");
    try
    {
        CMass <double>a(10, 7);
        CMass <double>b(10, 5);    
        cout << "b + a = " << b + a;
    }
    catch (const char* ex)
    {
        cout << ex;
    }
    cin.get();
    return 0;
}
файл mass.h
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#pragma once
#include <iostream>
#include <iomanip>
#include<cmath>
#ifndef MASS_H
#define MASS_H
using namespace std;
//Если не введён размер
void setSize(int&);
template <typename T>
class CMass
{
    
 
private:
    int size;
    T* mass;
    int index;
public:
    //Конструктор
    CMass(int s = 0, int I = 0) 
    {
        size = s;
        while (size <= 0)
            setSize(size);
        index = I;
        mass = (T*)calloc(size,sizeof(T));
        mass -= index;
        initrand();
    }
    //Конструктор копирования
    CMass(const CMass &  other) 
    {
        this->size = other.size;
        this->mass = new T[this->size];
        for (int i = 0; i < size; i++)
            this->mass[i] = other.mass[other.index + i];
    }
    //Поиск элемента
    T* Find(T x) 
    {
        for (int i = index; i < size + index; i++)
            if (mass[i] == x)
                return &mass[i];
        return NULL;
    }
    //Сортировка элементов
    void Sort(bool i)
    {
 
        if (i)//Если равен 1, тогда по возрастанию
        {
            for (int j = index; j < size + index; j++)
            {
                for (int h = j + 1; h < size + index; h++)
                    if (mass[j] > mass[h])
                    {
                        T tmp;
                        tmp = mass[j];
                        mass[j] = mass[h];
                        mass[h] = tmp;
                    }
            }
        }
        else//Иначе по убыванию
            for (int j = index; j < size + index; j++)
            {
                for (int h = j + 1; h < size + index; h++)
                    if (mass[j] < mass[h])
                    {
                        T tmp;
                        tmp = mass[j];
                        mass[j] = mass[h];
                        mass[h] = tmp;
                    }
            }
    }
    //Генерация чисел
    void initrand() 
    {
        for (int i = index; i < size + index; i++) 
            mass[i] = (T)(round((rand() * (100. + 100) / RAND_MAX - 100)*10)/10);//округление,чтобы был удобен поиск элемента
    }
    //Индексирование
    T& operator [](int CIndex)
    {
        if (CIndex<index || CIndex>index + size-1)
            throw "Вы вышли за границы массива!";
        return mass[CIndex];
    }
    //Вычитание и сложение
    CMass<T> operator+(const CMass<T>& other)
    {
        CMass result(size,0);
        if (size != other.size)
            throw "Размерность массивов разная";
        for (int i = 0; i < result.size; i++)
            result.mass[result.index + i] = mass[index + i] + other.mass[other.index + i];
        return result;
    }
    friend ostream& operator<<(ostream &os, const CMass<T>& a)
    {
        for (int i = 0; i < a.size; i++)
            os << setprecision(1) << a.mass[a.index + i] << " ";
        return os << endl;
    }
};
 
 
#endif
файл mass.cpp
C++
1
2
3
4
5
6
7
8
#include "mass.h"
#include <cstring>
#include <iostream>
void setSize(int& size)
{
        cout << "\nВведите размер массива: ";
        cin >> size;
}
Так же иногда, когда я пытаюсь пересобрать решение у меня появляется вот эти ошибки :
Невозможно открыть базу данных программы *путь*\Debug\vc142.pdb; если несколько файлов CL.EXE осуществляют запись в один и тот же PDB-файл, воспользуйтесь /FS файл-main.cpp
Невозможно открыть базу данных программы *путь*\Debug\vc142.pdb; если несколько файлов CL.EXE осуществляют запись в один и тот же PDB-файл, воспользуйтесь /FS файл-mass.cpp
Я не понимаю из-за чего они появляются,бывает создаю переменную int ,присваиваю ей значение 20 в конструкторе,даже никак её не использую и появляются эти ошибки.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2020, 12:47
Ответы с готовыми решениями:

Ввод вывод переменной класса, являющейся членом другого класса
Приветствую! У меня есть 2 класса: подкласс filling: class filling { private: int...

Создать класс обыкновенная дробь, поля класса – числитель и знаменатель. Методы класса: вывод дроби. В классе
Создать класс обыкновенная дробь, поля класса – числитель и знаменатель. Методы класса: вывод...

Проблема с шаблонами
Я новичок в Joomle. Изначально у меня стоял Денвер. Скачал joomla 1.7 Установил. теперь не могу...

Работа с шаблонами
я создаю 3 файла: template.hpp #ifndef VECTOR_H_ #define VECTOR_H_ namespace TT{ template...

4
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
16.05.2020, 12:52 2
Цитата Сообщение от sDeithwen Посмотреть сообщение
Почему так происходит и как это исправить ?
В конструкторе копирования копировать index нужно то же(или инициализировать чем то).
0
0 / 0 / 0
Регистрация: 02.10.2019
Сообщений: 5
16.05.2020, 13:13  [ТС] 3
Но мне ещё нужно чтобы в main.cpp можно было написать
C++
1
2
CMass <double>f;//f.index будет по умолчанию=0
f=a;//При этом f.index меняться не должен
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
16.05.2020, 13:16 4
Цитата Сообщение от sDeithwen Посмотреть сообщение
Но мне ещё нужно
Цитата Сообщение от sDeithwen Посмотреть сообщение
f=a;
Вы путаете конструктор копирования с оператором присваивания(который, кстати у вас вообще не определён, так же как и деструктор)
Распространенные ошибки
0
0 / 0 / 0
Регистрация: 02.10.2019
Сообщений: 5
16.05.2020, 16:52  [ТС] 5
Я сделал как писали, это помогло,но появилась другая непонятная ошибка:
Когда пишу в main.cpp
C++
1
2
3
4
5
6
        CMass <double>a(10, 7);
        CMass <double>b(10, 5);
        CMass <double>d = a;
        cout << d;
        CMass <double>f;
        cout << f;
В mass.cpp
C++
1
2
3
4
5
void setSize(int& size)
{
        cout << "\nВведите размер массива: ";
        cin >> size;
}
Программа доходит до конца функции setSize и вместо выхода из неё выдаёт ошибку
0
16.05.2020, 16:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2020, 16:52
Помогаю со студенческими работами здесь

Проблема с шаблонами
Шаблонная функция для создания массива template &lt;typename T&gt;T** CreateMatrix(int m, int n) {...

Работа с шаблонами с++
Добрый вечер. Опять возник вопрос( Нужно создать шаблон списка. Для этого нужно создать структуру,...

работа с шаблонами
Ребят может поможет кто-нибудь написать скриптик?)очень нужно, завтра сдавать) Для рекламного...

Блокнот с шаблонами
Вот нужно сделать в блокноте (сделал через RichEdit) функцию шаблонов, что бы можно было сохранять...

Работа с шаблонами
Здравствуйте, уважаемые программисты! Просьба к Вам будет малюпасенькая) Имеется БАЗА ДАННЫХ, на...

Работа с шаблонами
Всем доброго времени суток! Имеется шаблон, в нем поле {PAGE}. В это поле хочется загнать много...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru