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

Шаблон и оператор вывода! - C++

Восстановить пароль Регистрация
 
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
01.06.2009, 14:01     Шаблон и оператор вывода! #1
Вот код программы:
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
#include <iostream.h>
#pragma hdrstop
 
#pragma argsused
 
const int DefaultSize=10;
 
class Animal
{
    public:
    Animal();
    Animal(int);
    ~Animal() {}
    int GetWeight() const {return itsWeight;}
    void Display() const {cout << itsWeight;}
 
    private:
    int itsWeight;
};
 
Animal::Animal(int weight):itsWeight(weight) {}
 
Animal::Animal():itsWeight(0) {}
 
template <class T>
class Array
{
    public:
    Array(int itsSize=DefaultSize);
    Array(const Array &rhs);
    ~Array() {delete [] pType;}
    Array &operator=(const Array &rhs);
    T &operator[](int offset) {return pType[offset];}
    const T &operator[](int offset) const {return pType[offset];}
    int GetSize() const {return itsSize;}
    friend ostream &operator<<(ostream &,Array<T> &);
 
    private:
    T *pType;
    int itsSize;
};
 
template <class T>
Array<T>::Array(int size):itsSize(size)
{
    pType=new T[size];
    for (int i = 0; i < size; i++) {
        pType[i]=0;
    }
}
 
template <class T>
Array<T>::Array(const Array &rhs)
{
    itsSize=rhs.GetSize();
    pType=new T[itsSize];
    for (int i = 0; i < itsSize; i++) {
        pType[i]=rhs[i];
    }
}
 
template <class T>
Array<T> &Array<T>::operator=(const Array &rhs)
{
    if (this==&rhs) {
        return *this;
    }
    delete []pType;
    itsSize=rhs.GetSize();
    pType=new T[itsSize];
    for (int i = 0; i < itsSize; i++) {
        pType[i]=rhs[i];
    }
    return *this;
}
 
template <class T>
ostream &operator<<(ostream &output,Array<T> &theArray)
{
    for (int i = 0; i < theArray.GetSize(); i++) {
        output << "[" << theArray[i] << "]" << endl;
    }
    return output;
}
 
int main(int argc, char* argv[])
{
    bool Stop=false;
    int offset,value;
    Array<int> theArray;
 
    while (!Stop)
        {
            cout << "Enter an offset(0-9) ";
            cout << "and a value (-1) for stop: ";
            cin >> offset >> value;
 
            if (offset < 0) {
                break;
            }
 
            if (offset > 9) {
                cout << "***Please use values between 0 and 9***\n";
                continue;
            }
            theArray[offset]=value;
        }
 
    cout << "\n Here`s the entire array: \n";
    cout << theArray << endl;
 
    int j;
    cin >> j;
 
    return 0;
}
При компиляции выдает следующую ошибку:
[Linker Error] Error: Unresolved external 'operator <<(std::basic_ostream<char, std::char_traits<char> >&, Array<int>&)' referenced from C:\DOCUMENTS AND SETTINGS\AN\МОИ ДОКУМЕНТЫ\BORLAND STUDIO PROJECTS\DEBUG_BUILD\TEMPLATE2.OBJ

Если кто знает в чем проблема, подскажите пожайлуста!!!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16933 / 5338 / 328
Регистрация: 30.03.2009
Сообщений: 14,339
Записей в блоге: 26
01.06.2009, 14:34     Шаблон и оператор вывода! #2
Подозреваю, что проблема в том, что нет перегруженного оператора << для массива (например, строка 110). В любом случае ты методом тыка можешь начать отключать строки с "<<" и выяснить точно, на какй строке проблема
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
01.06.2009, 14:39  [ТС]     Шаблон и оператор вывода! #3
А разве в строках 78-84 оператор << не перегружается для массива???
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16933 / 5338 / 328
Регистрация: 30.03.2009
Сообщений: 14,339
Записей в блоге: 26
01.06.2009, 14:45     Шаблон и оператор вывода! #4
Цитата Сообщение от Alexandr_LN Посмотреть сообщение
А разве в строках 78-84 оператор << не перегружается для массива???
Вроде как прегружется, но я в Си++ почти не разбираюсь. Просто порекомендовал тебе, как точно выяснить, в каком месте проблема
SONNY
8 / 8 / 0
Регистрация: 30.05.2009
Сообщений: 47
01.06.2009, 15:44     Шаблон и оператор вывода! #5
Попробуй так
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
#include <iostream>
using namespace std;
 
const int DefaultSize=10;
 
class Animal
{
        public:
        Animal();
        Animal(int);
        ~Animal() {}
        int GetWeight() const {return itsWeight;}
        void Display() const {cout << itsWeight;}
 
        private:
        int itsWeight;
};
 
Animal::Animal(int weight):itsWeight(weight) {}
 
Animal::Animal():itsWeight(0) {}
 
template <class T>
class Array
{
        public:
        Array(int itsSize=DefaultSize);
        Array(const Array &rhs);
        ~Array() {delete [] pType;}
        Array &operator=(const Array &rhs);
        T &operator[](int offset) {return pType[offset];}
        const T &operator[](int offset) const {return pType[offset];}
        int GetSize() const {return itsSize;}
        ostream& Print( ostream& output ) const;
 
        private:
        T *pType;
        int itsSize;
};
 
template <class T>
Array<T>::Array(int size):itsSize(size)
{
        pType=new T[size];
        for (int i = 0; i < size; i++) {
                pType[i]=0;
        }
}
 
template <class T>
Array<T>::Array(const Array &rhs)
{
        itsSize=rhs.GetSize();
        pType=new T[itsSize];
        for (int i = 0; i < itsSize; i++) {
                pType[i]=rhs[i];
        }
}
 
template <class T>
Array<T> &Array<T>::operator=(const Array &rhs)
{
        if (this==&rhs) {
                return *this;
        }
        delete []pType;
        itsSize=rhs.GetSize();
        pType=new T[itsSize];
        for (int i = 0; i < itsSize; i++) {
                pType[i]=rhs[i];
        }
        return *this;
}
 
template<class T>
ostream& Array<T>::Print( ostream& output ) const
{
     for (int i = 0; i < itsSize; i++)
         output << "[" << pType[i] << "]" << endl;
     return output;
}
 
template <class T>
inline ostream& operator << ( ostream& out, const Array<T>& obj ){ return out << obj.Print( out ); }
 
int main(int argc, char* argv[])
{
        bool Stop=false;
        int offset,value;
        Array<int> theArray;
 
        while (!Stop)
                {
                        cout << "Enter an offset(0-9) ";
                        cout << "and a value (-1) for stop: ";
                        cin >> offset >> value;
 
                        if (offset < 0) {
                                break;
                        }
 
                        if (offset > 9) {
                                cout << "***Please use values between 0 and 9***\n";
                                continue;
                        }
                        theArray[offset]=value;
                }
 
        cout << "\n Here`s the entire array: \n";
        cout << theArray << endl;
 
        int j;
        cin >> j;
 
        return 0;
}
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
02.06.2009, 14:34  [ТС]     Шаблон и оператор вывода! #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
//---------------------------------------------------------------------------
#include <iostream.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
 
class Cat
{
    public:
    Cat():itsAge(2) {}
    Cat(int age):itsAge(age) {}
    ~Cat() {}
    int GetAge() const {return itsAge;}
    void SetAge(int age) {itsAge=age;}
 
    private:
    int itsAge;
};
 
template <class T>
class Array
{
    public:
    Array(int itsSize=10);
    Array(const Array &);
    ~Array() {delete []pType;}
    int GetSize() const {return itsSize;}
    Array &operator=(const Array &);
    T &operator[](int offset) {return pType[offset];}
    const T &operator[](int offset) const {return pType[offset];}
    ostream &operator<<(ostream &);
 
    private:
    int itsSize;
    T *pType;
};
 
template <class T>
ostream &operator<<(ostream &out,Array<T> &rhs)
{
    for (int i = 0; i < rhs.GetSize(); i++) {
        out << rhs[i] <<endl;
    }
    return out;
}
 
template <class T>
Array<T>::Array(int size):itsSize(size)
{
    pType=new T[size];
    for (int i = 0; i < size; i++) {
        pType[i]=0;
    }
}
 
template <class T>
Array<T>::Array(const Array &rhs)
{
    itsSize=rhs.GetSize();
    pType=new T[itsSize];
    for (int i = 0; i < itsSize; i++) {
        pType[i]=rhs[i];
    }
}
 
template <class T>
Array<T> &Array<T>::operator=(const Array &rhs)
{
    if (this==&rhs) {
        return *this;
    }
    delete []pType;
    itsSize=rhs.GetSize();
    pType=new T[itsSize];
    for (int i = 0; i < itsSize; i++) {
        pType[i]=rhs[i];
    }
    return *this;
}
 
int main(int argc, char* argv[])
{
    Array<int> var;
    Array<Cat> Cats;
    Cat *pCat;
 
    for (int i = 0; i < var.GetSize(); i++) {
        var[i]=i*2;
        pCat=new Cat(i*3);
        Cats[i]=*pCat;
        delete pCat;
    }
 
    cout << var << endl;
 
    /*for (int i = 0; i < var.GetSize(); i++) {
        cout << var[i] << endl;
    } */
 
    int j;
    cin >> j;
 
    return 0;
}
//---------------------------------------------------------------------------
Может кому пригодится )
Спасибо всем за помощь!!!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2009, 14:37     Шаблон и оператор вывода!
Еще ссылки по теме:

C++ Шаблон, вложенный в него класс и оператор вывода
Реализовать шаблон для вывода на экран содержимое любой мапы C++
Как перегрузить оператор вывода в поток для вектора? C++
Разработать шаблон класса для вывода вектора данных в поток C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16933 / 5338 / 328
Регистрация: 30.03.2009
Сообщений: 14,339
Записей в блоге: 26
02.06.2009, 14:37     Шаблон и оператор вывода! #7
> Может кому пригодится )

Ты бы в двух словах пояснил. Просто когда глазами сравниваешь коды длиной в 5 строк, то разницу видно. Когда коды более чем на одну страницу, то понять, в чём отличие - сложно. Мне как бы это не надо, но кому-то пригодилось бы
Yandex
Объявления
02.06.2009, 14:37     Шаблон и оператор вывода!
Ответ Создать тему
Опции темы

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