Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 01.04.2016
Сообщений: 6
1

Переписать создание вектора посредством шаблона

03.04.2016, 01:41. Показов 646. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток. Ранее уже обращался на этот форум за помощью - и мне помогли (за это низкий поклон). На этот раз я вновь обращаюсь с просьбой помочь мне (ибо уже в упор не вижу своей ошибки).
Работаю все с тем же кодом, что был в теме чуть ранее (Шаблон вектора и маааленькая неполадка), здесь продублирую его же, но с небольшими изменениями.

Есть Header:
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
#include <iostream>
#include <vector>
#include <Windows.h>
#include <time.h>
using namespace std;
 
template <class T>
class myVector {
    private:
        unsigned int size;
        T *body;
    public:
        //конструкторы
        myVector();
        myVector(int size);
        myVector(const T &vect);
        //деструктор
        ~myVector();
 
        void print() const;
        //перегрузка операторов
        T& operator[](int i);
        myVector& operator=(const myVector &vect);
        myVector operator+(const myVector &vect);
 
    };
    //Определение класса
    template <class T>
    myVector<T>::myVector(){
        body = new int[2];
        for (int i = 0; i < 2; ++i)
            body[i] = 0;
    };
    template <class T>
    myVector<T>::myVector(int vecSize){
        size = vecSize;
        body = new T[size];
        for (int i = 0; i < size; ++i)
            body[i] = 0;
    };
    template <class T>
    myVector<T>::myVector(const T &vect){
        size = vect.size;
        body = new int[size];
        for (int i = 0; i < size; i++)
            body[i] = vect.body[i];
    };
    template <class T>
    myVector<T>::~myVector(){
        delete[] body;
    };
    template <class T>
    void myVector<T>::print() const{
        for (int i = 0; i < size; ++i)
            cout << body[i] << " ";
        cout << endl;
    };
    template <class T>
    T& myVector<T>::operator[](int i){
        return body[i];
    };
    template <class T>
    myVector<T>& myVector<T>::operator=(const myVector &vect){
        for (int i = 0; i < size; i++)
            body[i] = vect.body[i];
        return *this;
    };
А так же есть .cpp:
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
#include "stdafx.h"
#include <iostream>
#include "myvector1.h"
#include <time.h>
#include <vector>
#include <Windows.h>
using namespace std;
 
//основная программа
int main()
{
    srand((unsigned)time(NULL));
    int N = 10;
    //int k = 3;
    //инициализация трех векторов
 
    myVector<double> vect(N), vect2(N);
    //заполнение случайными числами
    for (int i = 0; i < N; ++i)
        vect[i] = rand() % 10;
    for (int i = 0; i < N; ++i)
        vect2[i] = rand() % 10;
 
 
    //Вывод и проверка, что операторы работают    
    vect.print();
    vect2.print();
    if (&vect == &vect2) {
        cout << "truble!\n";
    }
    else {
        if (&vect <= &vect2) {
            cout << "first true\n";
        }
        else { cout << "second true\n"; }
    }
 
    system("pause");
 
    return 0;
}
В чем же соль... Соль в том, что в моем Header идет конкретное приведение типов к типу int. Мне же дано задание сделать так, чтобы мои вектора можно было заполнять любыми данными (без приведения к типу int), согласно запросу в main (в представленном примере вектора должны быть заполнены элементами типа double). Как мне сказал преподаватель, нужно что-то дописать в конструкторе, и что это что-то уже есть в моем header. Вот только я в упор уже не вижу, что именно, где и на что нужно поменять/дописать и т.д....
Пожалуйста, помогите... И, если можно, объясните, где я такой косяк успел устроить. Всем заранее спасибо, добра и плюшек!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2016, 01:41
Ответы с готовыми решениями:

Создание нового вектора посредством выборки значений данного вектора
Добрый день! Знаю, вопрос совсем простецкий, но как-то я совсем запуталась... Есть вектор из...

Удалить элемент вектора посредством erase
# include &lt;iostream&gt; # include &lt;vector&gt; # include &lt;iterator&gt; # include &lt;string&gt; # include...

Формирование вектора посредством использования конструкции For
Здравствуйте, как реализовать формирование вектора Sam с помощью конструкции For?

как получить адрес элемента вектора посредством g++?
#include &lt;vector&gt; #include &lt;iostream&gt; using namespace std; int main(){ return 0; ...

6
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
03.04.2016, 03:24 2
А зачем ты его при создании интом распределяешь и зачем вообще при создании пустого что то распределяешь?
как минимум:
C++
1
body = new int[2];
заменить на
C++
1
body = new T[2];
Опять же, заполняешь ты их интами хотя они и преобразуются в даблы.
Попробуй вот так заполнить
C++
1
vect[i] = rand() / 100.;
посмотри что получится.
0
0 / 0 / 0
Регистрация: 01.04.2016
Сообщений: 6
03.04.2016, 03:45  [ТС] 3
К сожалению, он все так же все преобразовывает в тип int... ((( Видимо есть что-то еще.
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
03.04.2016, 04:29 4
Цитата Сообщение от ВиталийНех Посмотреть сообщение
vect[i] = rand() % 10;
Всё дело в этой строчке. Ты генерируешь числа от 0 до 10. Всегда целые.
И конструктор копии у тебя не верный, подавать нужно объект класса, а не тип)

header:
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
#pragma once
#include <iostream>
#include <time.h>
using namespace std;
 
template <typename T>
class myVector {
private:
    unsigned int size;
    T *body;
public:
    //конструкторы
    myVector<T>();
    myVector<T>(int size);
    myVector<T>(const myVector<T> &vect);
    //деструктор
    ~myVector<T>();
 
    void print() const;
    //перегрузка операторов
    T& operator[](int i);
    myVector<T>& operator=(const myVector<T> &vect);
    myVector<T> operator+(const myVector<T> &vect);
 
};
//Определение класса
template <typename T>
myVector<T>::myVector() {
    body = nullptr;
    size = 0;
};
 
template <typename T>
myVector<T>::myVector(int vecSize) {
    size = vecSize;
    body = new T[size];
    for (int i = 0; i < size; ++i)
        body[i] = 0;
};
 
template <typename T>
myVector<T>::myVector(const myVector &vect) {
    size = vect.size;
    body = new T[size];
    for (int i = 0; i < size; i++)
        body[i] = vect.body[i];
};
template <typename T>
myVector<T>::~myVector() {
    delete[] body;
}
template<typename T>
void myVector<T>::print() const
{
    for (int i = 0; i < size; ++i)
        cout << body[i] << " ";
    cout << endl;
}
;
 
 
template <typename T>
T& myVector<T>::operator[](int i) {
    return body[i];
};
 
template <typename T>
myVector<T>& myVector<T>::operator=(const myVector<T> &vect) {
    for (int i = 0; i < size; i++)
        body[i] = vect.body[i];
    return *this;
};
cpp:
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
#include <iostream>
#include "myvector1.h"
#include <time.h>
 
using namespace std;
 
//основная программа
int main()
{
    srand((unsigned)time(NULL));
    int N = 10;
    //int k = 3;
    //инициализация трех векторов
 
    myVector<double> vect(N), vect2(N);
    //заполнение случайными числами
    for (int i = 0; i < N; ++i)
        vect[i] = rand()/static_cast<double>(RAND_MAX) * 10;
    for (int i = 0; i < N; ++i)
        vect2[i] = rand() / static_cast<double>(RAND_MAX) * 10;
 
 
    //Вывод и проверка, что операторы работают
    vect.print();
    vect2.print();
    if (&vect == &vect2) {
        cout << "truble!\n";
    }
    else {
        if (&vect <= &vect2) {
            cout << "first true\n";
        }
        else { cout << "second true\n"; }
    }
 
    system("pause");
 
    return 0;
}
Остальное переделывать лень
1
0 / 0 / 0
Регистрация: 01.04.2016
Сообщений: 6
03.04.2016, 07:26  [ТС] 5
Большое спасибо, значительно помогло))) Вот только теперь возникла иная незадачка:
Теперь если я хочу, чтобы мои вектора были заполнены элементами типа int, компилятор мне сообщает следующее:
Ошибка 1 error C2668: myVector<int>::myVector: неоднозначный вызов перегруженной функции c:\users\гектор\documents\visual studio 2013\projects\consoleproject\consoleproject.cpp 17 1 ConsoleProject
3 IntelliSense: существует более одного экземпляра конструктора "myVector<T>::myVector [с T=int]", соответствующего списку аргументов:
функция "myVector<T>::myVector(int vecSize) [с T=int]"
функция "myVector<T>::myVector(const T &vect) [с T=int]"
типы аргументов: (int) c:\Users\Гектор\Documents\Visual Studio 2013\Projects\ConsoleProject\ConsoleProject.cpp 17(строка) 21(столбец) ConsoleProject
4 IntelliSense: существует более одного экземпляра конструктора "myVector<T>::myVector [с T=int]", соответствующего списку аргументов:
функция "myVector<T>::myVector(int vecSize) [с T=int]"
функция "myVector<T>::myVector(const T &vect) [с T=int]"
типы аргументов: (int) c:\Users\Гектор\Documents\Visual Studio 2013\Projects\ConsoleProject\ConsoleProject.cpp 17(строка) 31(столбец) ConsoleProject
Понимаю, что я уже, фактически, выклянчиваю все готовенькое... но я уже достиг своего предела понимания происходящего вообще((((
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
03.04.2016, 19:26 6
ВиталийНех, я же сказал выше, что конструктор копии построен не верно.
Посмотри на то, что я скинул тебе (хотя бы именно его) и будет тебе счастье.
1
0 / 0 / 0
Регистрация: 01.04.2016
Сообщений: 6
04.04.2016, 02:11  [ТС] 7
Огромнейшее спасибо!!! Да, с учебой, работой иными заботами уже перестаешь обращать внимание на мелкие детали. Все работает и работает в лучшем виде!)))
0
04.04.2016, 02:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2016, 02:11
Помогаю со студенческими работами здесь

Как реализовать матрицу посредством двумерного вектора? (std::vector)
const int matrix_A_Columns = 12000; const int matrix_A_Rows = 25000; double matrix_A; как...

Создание контейнера (вектора), хранящего вектора разной размерности
Можно ли в матлабе создать вектор, который будет хранить вектора разной размерности? Добавлено...

Описать функции для шаблона вектора
Добрый день, форумчане! Выполняем лабораторную работу в университете по шаблонам и классу вектор,...

Переписать код без Вектора
Задание: Для произвольного текста(Взятого из файла), содержащего не более 10 строк, в каждой...


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

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