302 / 160 / 62
Регистрация: 27.02.2010
Сообщений: 317
1

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

04.02.2011, 14:33. Показов 11194. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток!
Подскажите, в чем ошибка - есть класс, в котором присутствуют 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. это пример из Дейтелов
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2011, 14:33
Ответы с готовыми решениями:

Перегрузка операций ввода/вывода
Доброго времени суток господа и дамы! Нужно решить один нюанс. Никак не получается. Есть код:...

Перегрузка операций ввода/вывода в шаблоне класса
template &lt;typename T&gt; class Vector { private: T * data; int size; public: Vector(int);...

Переопределение операций ввода-вывода
Решите, пожалуйста, если не трудно) Переопределить операции &lt;&lt; и &gt;&gt; для ввода-вывода матриц...

Перегрузка вывода и ввода
Здравствуйте прошу помочь ,написал программу в ней нужно перегрузить вывод и ввод ,как это можно...

4
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
04.02.2011, 14:59 2
Экстрасенсы в отпуске. Какие ошибки выдаёт компилятор?
0
302 / 160 / 62
Регистрация: 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...
Может не подключена какая-то библиотека?...
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
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;
}
3
302 / 160 / 62
Регистрация: 27.02.2010
Сообщений: 317
04.02.2011, 15:51  [ТС] 5
silent_1991, СПАСИБО!!! Выручил)!
0
04.02.2011, 15:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.02.2011, 15:51
Помогаю со студенческими работами здесь

Перегрузка ввода и вывода
Ребят столкнулся с такой проблемой что не работает перегрузка и я не могу понять в чём ошибка вроде...

Перегрузка ввода и вывода
Помогите пожалуйста перегрузить операцию ввода для шаблонного чтобы заполнить массив или подскажите...

Перегрузка оператора ввода ,вывода
Вообщем проблема такая есть класс в нем приват поля и перегружены 2 дружественных оператора ввода...

Перегрузка операторов ввода/вывода
Вроде сделал, но не работает перегрузка оператора ввода. #include &quot;stdafx.h&quot; #include...


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

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

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