Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.76
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
#1

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

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

Всем доброго времени суток!
Подскажите, в чем ошибка - есть класс, в котором присутствуют 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2011, 14:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка операций ввода/вывода (C++):

Перегрузка операций ввода/вывода - C++
Доброго времени суток господа и дамы! Нужно решить один нюанс. Никак не получается. Есть код: #include &lt;iostream&gt; #include &lt;stdlib.h&gt;...

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

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

Перегрузка операторов ввода и вывода - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; class ComplexNumber { private: double a, b; ...

Перегрузка оператора ввода вывода - C++
Есть два хэдера(header.h и Array.h) и исполняемая программа main.cpp в которой я как раз и обращаюсь к оператору ввода Array.h ...

Перегрузка операторов ввода\вывода - C++
Вот такой простенький пример описан во многих постах, есть в некоторых видео но у меня в компиляторе mvs 2015, при компиляции выдает...

4
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
04.02.2011, 14:59 #2
Экстрасенсы в отпуске. Какие ошибки выдаёт компилятор?
0
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...
Может не подключена какая-то библиотека?...
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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;
}
2
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
04.02.2011, 15:51  [ТС] #5
silent_1991, СПАСИБО!!! Выручил)!
0
04.02.2011, 15:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2011, 15:51
Привет! Вот еще темы с ответами:

Перегрузка операторов ввода вывода - C++
ребята болит уже голова)) main.cpp #include &quot;myStr.h&quot; int main() { myStr myS(&quot;ok&quot;); cout&lt;&lt;myS&lt;&lt;endl;//надо чтоб...

Перегрузка операторов ввода вывода - C++
в .h файле сделал объявление inline ostream&amp; operator &lt;&lt;(ostream&amp;, const Proc&amp;); inline istream&amp; operator &gt;&gt;(istream&amp;, Proc&amp;); в...

Перегрузка операторов ввода/вывода. - C++
Класс комплексных чисел. Нужно чтобы программа выводила и вводила в таком виде (функции in и out): #include &lt;iostream&gt; #include...

Перегрузка ввода/вывода в/из потока - C++
Никогда потоками не пользовался, поэтому не знаю. Как перегрузить для ввода из потока оператор operator &gt;&gt;? Как перегрузить для вывода в...


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

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

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