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

Перегрузка операций ввода/вывода - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.76
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
04.02.2011, 14:33     Перегрузка операций ввода/вывода #1
Всем доброго времени суток!
Подскажите, в чем ошибка - есть класс, в котором присутствуют 2 функции-друга, которые перегружают операции ввода/вывода. Но они не работают - компилятор выдает ошибки... Как правильно выполнить перегрузку?
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
//Array.h
#pragma once
 
#ifndef Array_h
#define Array_h
#include <iostream>
 
class Array
{
    friend ostream& operator<< (ostream&,  const Array);
    friend istream& operator>> (istream&, Array&);
 
public:
    Array(int =10); //конструктор с умолчанием
    Array(const Array &); //конструктор копирования
    ~Array(void); //деструктор
 
    int getSize () const; //функция получения размера массива
    const Array &operator= (const Array &); //перегрузка операции = (возвращает ссылку на Array, чтобы можно было а=b=c)
 
    int operator == (const Array &) const; //перегрузка оператора == (сравнение на равенство)
    int operator!= (const Array &) const; //перегрузка оператора != (сравнение на неравенство)
 
    int &operator[] (int); //перегрузка операции [] (обязательно как функция-элемент) возвращает ссылку на индекс int, чтобы можно было g[5]=1000
    static int getArrayCount(); //статисеская функция - возвращает количество элементов типа Array
 
private:
    int *ptr; //указатель на начало массива
    int size; //размер массива
    static int ArrayCount; //статисеская переменная - количество элементов типа Array
};
#endif
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
#include "StdAfx.h"
#include "Array.h"
#include <assert.h>
#include <iostream>
#include <stdlib.h>
 
int Array::ArrayCount=0;
 
Array::Array (int arraySize)
{
    ++ArrayCount;
    size=arraySize;
    ptr=new int [size];
    for (int i=0; i<size; i++)
        ptr[i]=0;
}
Array::Array(const Array &init)
{
    ++ArrayCount;
    size=init.size;
    ptr=new int [size];
    for (int i=0; i<size; i++)
        ptr[i]=init.ptr[i];
}
Array::~Array(void)
{
    --ArrayCount;
    delete [] ptr;
}
 
int Array::getSize () const {return size; }
 
const Array & Array::operator= (const Array &init)
{
    if (&init!=this) //не равен самому себе
    {
        delete [] ptr;
        size=init.size;
        ptr=new int [size];
        for (int i=0; i<size; i++)
            ptr[i]=init.ptr[i];
    }
    return *this;
}
 
int Array::operator == (const Array &init) const
{
    if (size!=init.size)
        return 0;
    for (int i=0; i<size; i++)
        if (ptr[i]!=init.ptr[i])
            return 0;
    return 1;
}
int Array::operator!= (const Array &init) const
{
    if (size!=init.size)
        return 1;
    for (int i=0; i<size; i++)
        if (ptr[i]!=init.ptr[i])
            return 1;
    return 0;
}
int & Array::operator [] (int a)
{
    assert (0<=a && a<size);
    return ptr[a];
}
int Array::getArrayCount() { return ArrayCount; }
 
ostream & operator<< (ostream &output, const Array num)
{
    for (int i=0; i<num.size; i++)
    {
        output<<num.ptr[i]<<" ";
        if ((i+1)%10==0)
            output<<endl;
    }
    if (i%10==0)
        output<<endl;
    return output;
}
istream & operator<<(istream &input, Array &num);
{
    for (int i=0; i<num.size; i++)
        input>>num.ptr;
    return input;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "stdafx.h"
#include<iostream>
#include "Array.h"
using namespace std;
 
int main()
{
    setlocale (LC_ALL, "Russian");
    Array a;
    cout<<"Количество созданных элементов: "<<a.getArrayCount()<<endl;
   return 0;
}
P.S. это пример из Дейтелов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
04.02.2011, 14:59     Перегрузка операций ввода/вывода #2
Экстрасенсы в отпуске. Какие ошибки выдаёт компилятор?
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
04.02.2011, 15:13  [ТС]     Перегрузка операций ввода/вывода #3
Error 1 error C2143: syntax error : missing ';' before '&' array.h 10
Error 2 error C2433: 'ostream' : 'friend' not permitted on data declarations array.h 10
Error 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int array.h 10
Error 4 error C2061: syntax error : identifier 'ostream' array.h 10
Error 5 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int array.h 10
Error 6 error C2805: binary 'operator <<' has too few parameters array.h 10
Error 7 error C2143: syntax error : missing ';' before '&' array.h 11
Error 8 error C2433: 'istream' : 'friend' not permitted on data declarations array.h 11

Ошибки такого плана - их 39...
Может не подключена какая-то библиотека?...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
04.02.2011, 15:48     Перегрузка операций ввода/вывода #4
У вас istream/ostream входят в пространство имён std, не забывайте.

Добавлено через 8 минут
Вот такой должен быть код (так, по крайней мере, компилируется):

Array.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
#ifndef Array_h
#define Array_h
#include <iostream>
 
using namespace std; // !!!добавил это!!!
 
class Array
{
        friend ostream& operator<< (ostream&,  const Array);
        friend istream& operator>> (istream&, Array&);
 
public:
        Array(int =10); //конструктор с умолчанием
        Array(const Array &); //конструктор копирования
        ~Array(void); //деструктор
 
        int getSize () const; //функция получения размера массива
        const Array &operator= (const Array &); //перегрузка операции = (возвращает ссылку на Array, чтобы можно было а=b=c)
 
        int operator == (const Array &) const; //перегрузка оператора == (сравнение на равенство)
        int operator!= (const Array &) const; //перегрузка оператора != (сравнение на неравенство)
 
        int &operator[] (int); //перегрузка операции [] (обязательно как функция-элемент) возвращает ссылку на индекс int, чтобы можно было g[5]=1000
        static int getArrayCount(); //статисеская функция - возвращает количество элементов типа Array
 
private:
        int *ptr; //указатель на начало массива
        int size; //размер массива
        static int ArrayCount; //статисеская переменная - количество элементов типа Array
};
#endif
Array.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
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
#include "Array.h"
#include <assert.h>
#include <iostream>
#include <stdlib.h>
 
using namespace std; // !!!добавил это!!!
 
int Array::ArrayCount=0;
 
Array::Array (int arraySize)
{
        ++ArrayCount;
        size=arraySize;
        ptr=new int [size];
        for (int i=0; i<size; i++)
                ptr[i]=0;
}
Array::Array(const Array &init)
{
        ++ArrayCount;
        size=init.size;
        ptr=new int [size];
        for (int i=0; i<size; i++)
                ptr[i]=init.ptr[i];
}
Array::~Array(void)
{
        --ArrayCount;
        delete [] ptr;
}
 
int Array::getSize () const {return size; }
 
const Array & Array::operator= (const Array &init)
{
        if (&init!=this) //не равен самому себе
        {
                delete [] ptr;
                size=init.size;
                ptr=new int [size];
                for (int i=0; i<size; i++)
                        ptr[i]=init.ptr[i];
        }
        return *this;
}
 
int Array::operator == (const Array &init) const
{
        if (size!=init.size)
                return 0;
        for (int i=0; i<size; i++)
                if (ptr[i]!=init.ptr[i])
                        return 0;
        return 1;
}
int Array::operator!= (const Array &init) const
{
        if (size!=init.size)
                return 1;
        for (int i=0; i<size; i++)
                if (ptr[i]!=init.ptr[i])
                        return 1;
        return 0;
}
int & Array::operator [] (int a)
{
        assert (0<=a && a<size);
        return ptr[a];
}
int Array::getArrayCount() { return ArrayCount; }
 
ostream & operator<< (ostream &output, const Array num)
{
    int i; // !!!добавил это!!!
 
        for (/* !!!убрал int!!! */i=0; i<num.size; i++)
        {
                output<<num.ptr[i]<<" ";
                if ((i+1)%10==0)
                        output<<endl;
        }
        if (i%10==0)
                output<<endl;
        return output;
}
istream & operator>>/* !!!здесь поменял << на >>!!! */(istream &input, Array &num) // !!!здесь убрал точку с запятой!!!
{
        for (int i=0; i<num.size; i++)
                input>>num.ptr[i]; // !!!здесь добавил [i]
        return input;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
#include "Array.h"
using namespace std;
 
int main()
{
        setlocale (LC_ALL, "Russian");
        Array a;
        cout<<"Количество созданных элементов: "<<a.getArrayCount()<<endl;
   return 0;
}
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
04.02.2011, 15:51  [ТС]     Перегрузка операций ввода/вывода #5
silent_1991, СПАСИБО!!! Выручил)!
Yandex
Объявления
04.02.2011, 15:51     Перегрузка операций ввода/вывода
Ответ Создать тему
Опции темы

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