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

шаблон класса вектор - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
lis154
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 47
23.11.2011, 15:18     шаблон класса вектор #1
Программа написана в qt
при компиляции выдает ошибки - помогите разобраться. Вроде все написано правильно.
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
template <class T, int Size>
class cVector
{
        T *m_data;
 
public:
        cVector();
        ~cVector();
        T &operator[](int index);
};
 
 
template <class T, int Size>
cVector<T, Size>::cVector()
{
        m_data = new int [Size];
}
 
template <class T, int Size>
cVector<T, Size>::~cVector()
{
        delete [] m_data;
}
 
template <class T, int Size>
T &cVector<T, Size>::operator[](int index)
{
        if(index < 0)
        {
                //MessageBox(0, L"Error: Index < 0!", "Error", MB_OK);
 
                return m_data[0];
        }
        if(index > Size)
        {
               // MessageBox(0, L"Error: Index > Size!", "Error", MB_OK);
 
                return m_data[0];
        }
 
        return m_data[index];
}
 
#endif // VECTOR_H
 
 
 
 
Main
 
#include <iostream>
 
#include "Vector.h"
 
int main(void)
{
 
        cVector<double, 10> a;
 
        for(int i = 0; i < 10; i++)
        {
                a[i] = 123;
        }
 
        int i;
        std::cin >> i;
        return 0;
}

ошибки такие -
pointer to a function used to arithmetic -на строчку внутри цикла
assignment of read-only location -
cannot convert 'int' to cVector <double,10> ()() is assignment - все на одну и туже строчку
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2011, 15:18     шаблон класса вектор
Посмотрите здесь:

Шаблон класса вектор с двумя членами-данными C++
Шаблон класса вектор C++
Шаблон класса (параметризация класса) C++
C++ вектор,шаблон
шаблон класса вектор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
23.11.2011, 15:42     шаблон класса вектор #2
У вас в конструкторе ошибка

C++
1
2
3
4
5
template <class T, int Size>
cVector<T, Size>::cVector()
{
        m_data = new int [Size];
}
Вы делаете экземпляр класса для аргумента типа double, а в конструкторе выделяетек память под массив для типа int

Наверное надо написать

C++
1
2
3
4
5
template <class T, int Size>
cVector<T, Size>::cVector()
{
        m_data = new T [Size];
}
lis154
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 47
23.11.2011, 22:58  [ТС]     шаблон класса вектор #3
работает без ошибок. Но когда пытаюсь вывести массив ничего не получается(

код main

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main(void)
{
 
        cVector<int, 10> a;
 
        //cout << "1234123" << endl;
        for(int i = 0; i < 10; i++)
        {
                a[i] = 123;
        }
 
 
        int i;
        std::cin >> i;
        cout << a[2] << endl;
        for (i=0;i<10;i++)
        {
        cout << a[i] << endl;
    }
        return 0;
}
Сыроежка
Заблокирован
23.11.2011, 23:03     шаблон класса вектор #4
lis154,

А что именно у вас не получается? Я заметил, что в одном месте вы используете префикс с именем пространства имен std::, а в другом - нет.
lis154
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 47
23.11.2011, 23:49  [ТС]     шаблон класса вектор #5
спасибо за помощь. Она заработала))) теперь осталось только перегрузить операторы >><< = ))))
lis154
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 47
25.11.2011, 18:42  [ТС]     шаблон класса вектор #6
Опять столкнулся с трудностями( вроде все делал правильно но перегрузка операторов почему то не получается(
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <iostream>
using std::ostream;
using std::istream;
 
 
template <class T, int Size>
class cVector
{
        T *m_data;
 
public:
        cVector();
        ~cVector();
        T &operator[](int index);
       friend istream & operator>>(istream &, T &);
       friend ostream &operator<<( ostream &, const T &);
       T operator=( T &right);
};
 
 
template <class T, int Size>
cVector<T, Size>::cVector()
{
        m_data = new T [Size];
}
 
template <class T, int Size>
cVector<T, Size>::~cVector()
{
        delete [] m_data;
}
 
template <class T, int Size>
T &cVector<T, Size>::operator[](int index)
{
        if(index < 0)
        {
 
                return m_data[0];
        }
        if(index > Size)
        {
 
                return m_data[0];
        }
 
        return m_data[index];
}
 
template <class T, int Size>
 istream & operator>>(istream &input, T &a)
{
 
         for(int i=0; i<10; i++)
 
                 input>>a[i];
 
 
 
         return input;
 
}
template <class T, int Size>
 ostream &operator<<( ostream &os, const T &a) // перегрузка вывода
 
         {
 
         for(int i=0; i<10; i++)
 
                 {
            if (a[i]==0) os << "пустой массив";
            else os << a[i];
            os << std::endl;
                 }
 
         return os;
 
         }
 
template <class T, int Size>
T &cVector<T, Size>::operator=( T &right)
 
    {
 
    for(int i=0; i<10; i++)
 
       m_date[i]=right.m_date[i];
 
    return *this;
 
    }
#endif // VECTOR_H
 
Main
#include <iostream>
 
#include "Vector.h"
using std::cout;
using std::cin;
using std::endl;
int main(void)
{
 
        cVector<int, 10> a;
 
        //cout << "1234123" << endl;
        for(int i = 0; i < 10; i++)
        {
           // cout << "1234123" << endl;
                a[i] = 123;
        }
        cVector<double, 10> b;
        for(int h = 0; h < 10; h++)
        {
           // cout << "1234123" << endl;
                b[h] = 1221;
        }
 
        //int i;
        //std::cin >> i;
        //cout << a[2] << endl;
        for (int j=0;j<10;j++)
        {
        cout << b[j] << endl;
        cout << a[j] << endl;
    }
        getchar ();
        return 0;
}
 Комментарий модератора 
В следующий раз будет карточка.
Сыроежка
Заблокирован
25.11.2011, 19:28     шаблон класса вектор #7
lis154,

У вас две ошибки, связанные с операторами, в определении вашего класса.

Во-первых, оператор

C++
1
T &operator[](int index);
должен быть перегружен для возврата константной ссылки. В противном случае вы не сможете его использовать в операторе вывода <<.

Поэтому нужно еще второе его определение

C++
1
 const T & operator[](int index) const;
Кроме того желательно оператор присваивания, который у вас объявлен следующим образом

C++
1
T operator=( T &right);
объявить для константного операнда. То есть здесь вам надо уже заменить ваш оператор присваивания на следующий

C++
1
T & operator=( const T &right);
Конечно ваш оператор также корректный, но вы снова можете встретиться с ошибками времени компиляции, когда будет требоваться константная ссылка в качестве операнда.

К тому же возвращаемым значением лучше сделать ссылку на сам объект.
lis154
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 47
25.11.2011, 19:46  [ТС]     шаблон класса вектор #8
Спасибо. У меня еще возникли проблемы. Мне кажется что я неправильно использую шаблон класса в методе перегрузки оператора =. в следствии этого возникли следующие ошибки.

C:/qt1/Vector/Vector.h:86: error: no `T& cVector<T, Size>::operator=(const T&)' member function declared in class `cVector<T, Size>'
C:/qt1/Vector/Vector.h:86: error: template definition of non-template `T& cVector<T, Size>::operator=(const T&)'
C:/qt1/Vector/main.cpp:31: error: ambiguous overload for 'operator<<' in 'std::cout << (&a)->cVector<T, Size>::operator[] [with T = int, int Size = 10](j)'
Сыроежка
Заблокирован
25.11.2011, 19:56     шаблон класса вектор #9
Цитата Сообщение от lis154 Посмотреть сообщение
Спасибо. У меня еще возникли проблемы. Мне кажется что я неправильно использую шаблон класса в методе перегрузки оператора =. в следствии этого возникли следующие ошибки.

C:/qt1/Vector/Vector.h:86: error: no `T& cVector<T, Size>::operator=(const T&)' member function declared in class `cVector<T, Size>'
C:/qt1/Vector/Vector.h:86: error: template definition of non-template `T& cVector<T, Size>::operator=(const T&)'
C:/qt1/Vector/main.cpp:31: error: ambiguous overload for 'operator<<' in 'std::cout << (&a)->cVector<T, Size>::operator[] [with T = int, int Size = 10](j)'
Я не посмотрел внимательно, но вы не определили копирующего оператора присваивания для вашего класса. Вы лишь определили оператор присваивания, операндом которого является объект типа T. А нужно чтобы операндом был объект вашего класса. А объектом ващего класса является вектор.
lis154
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 47
25.11.2011, 20:02  [ТС]     шаблон класса вектор #10
Я наверно еще плохо в этом разбираюсь. Можете поподробнее объяснить про копирующий оператор присваивания?)
Сыроежка
Заблокирован
25.11.2011, 20:14     шаблон класса вектор #11
Цитата Сообщение от lis154 Посмотреть сообщение
Я наверно еще плохо в этом разбираюсь. Можете поподробнее объяснить про копирующий оператор присваивания?)
В вашем классе должен быть определен конструктор копирования и копирующий оператор присваивания, иначе у вас может возникнуть утечка памяти. Либо, если вы не хотите, чтобы один объект вашего класса присваивался другому объекту вашего класса, то можно их объявить закрытыми членами класса и не определять.

Определение копирующего оператора присваивания для вашего класса может выглядеть следующим образом

C++
1
2
3
4
5
6
7
8
9
10
11
template <class T, int Size>
cVector<T, Size> & cVector<T, Size>::operator =( const cVector<T, Size> &rhs )
{
 
   if ( this != &rhs )
   {
      std::copy( rhs.m_data, rhs.m_data + Size, m_data );
   }      
 
   return ( *this );
}
Вместо стандартного алгоритма std::copy, объявленного в <algorithm> вы сами можете поэлементно в цикле скопировать один массив в другой.
lis154
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 47
25.11.2011, 20:39  [ТС]     шаблон класса вектор #12
C:/qt1/Vector/Vector.h:85: error: prototype for `cVector<T, Size>& cVector<T, Size>::operator=(const cVector<T, Size>&)' does not match any in class `cVector<T, Size>'
C:/qt1/Vector/Vector.h:19: error: candidate is: T cVector<T, Size>::operator=(const cVector<T, Size>&)
C:/qt1/Vector/Vector.h:85: error: template definition of non-template `cVector<T, Size>& cVector<T, Size>::operator=(const cVector<T, Size>&)'
как я понимаю эти ошибки тоже связаны с шаблоном?
Сыроежка
Заблокирован
25.11.2011, 20:41     шаблон класса вектор #13
Цитата Сообщение от lis154 Посмотреть сообщение
C:/qt1/Vector/Vector.h:85: error: prototype for `cVector<T, Size>& cVector<T, Size>::operator=(const cVector<T, Size>&)' does not match any in class `cVector<T, Size>'
C:/qt1/Vector/Vector.h:19: error: candidate is: T cVector<T, Size>::operator=(const cVector<T, Size>&)
C:/qt1/Vector/Vector.h:85: error: template definition of non-template `cVector<T, Size>& cVector<T, Size>::operator=(const cVector<T, Size>&)'
как я понимаю эти ошибки тоже связаны с шаблоном?
Это связано с тем, что внутри класса вы не объявили этот оператор присваивания, а лишь определили его вне класса. Поэтому компилятор и не может его найти, так как он просматривает объявления внутри класса.
lis154
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 47
25.11.2011, 22:37  [ТС]     шаблон класса вектор #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class cVector
{
        T *m_data;
 
public:
        cVector();
        ~cVector();
        T &operator[](int index);
       friend istream & operator>>(istream &, T &);
       friend ostream &operator<<( ostream &, const T &);
       T operator=(const cVector <T, Size> &rhs);
      // const T & operator[](int index) const;
};
у меня есть оператор присваивания внутри класса? разве он не так объявляется?
Сыроежка
Заблокирован
26.11.2011, 05:05     шаблон класса вектор #15
Цитата Сообщение от lis154 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class cVector
{
        T *m_data;
 
public:
        cVector();
        ~cVector();
        T &operator[](int index);
       friend istream & operator>>(istream &, T &);
       friend ostream &operator<<( ostream &, const T &);
       T operator=(const cVector <T, Size> &rhs);
      // const T & operator[](int index) const;
};
у меня есть оператор присваивания внутри класса? разве он не так объявляется?
ваше объявление оператора присваивания не соответствует тому определению оператора присваивания, которое я вам продемонстрировал. Если вы его используете, то у вас в классе должно быть объявленик

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class cVector
{
        T *m_data;
 
public:
        cVector();
        ~cVector();
        T &operator[](int index);
       friend istream & operator>>(istream &, T &);
       friend ostream &operator<<( ostream &, const T &);
       cVector<T, Size> & operator =( const cVector<T, Size> &rhs );
      // const T & operator[](int index) const;
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2011, 11:15     шаблон класса вектор
Еще ссылки по теме:

шаблон класса вектор C++
C++ Шаблон вектор в шаблоне стека -.-
Шаблон класса вектор с операциями индексации и функциями insert и erase C++

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

Или воспользуйтесь поиском по форуму:
lis154
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 47
26.11.2011, 11:15  [ТС]     шаблон класса вектор #16
спасибо. Т.е. мне и для операторов ввода нужно также поступить?

C:/qt1/Vector/main.cpp:30: error: ambiguous overload for 'operator<<' in 'std::cout << (&b)->cVector<T, Size>::operator[] [with T = double, int Size = 10](j)'

Добавлено через 1 час 55 минут
с этим разобрался, но возникла новая ошибка когда пытаюсь записать в массив данные типа char
C++
1
2
3
4
5
6
7
8
 cVector<double, 10> b;
        cVector<char,10> p;
        for(int h = 0; h < 10; h++)
        {
           // cout << "1234123" << endl;
                b[h] = 1221;
                p[h] = "asdf";
        }
C:/qt1/Vector/main.cpp:24: error: invalid conversion from `const char*' to `char'
Yandex
Объявления
26.11.2011, 11:15     шаблон класса вектор
Ответ Создать тему
Опции темы

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