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

Перегрузка оператора ввода вывода - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
28.04.2013, 10:29     Перегрузка оператора ввода вывода #1
Есть два хэдера(header.h и Array.h) и исполняемая программа main.cpp в которой я как раз и обращаюсь к оператору ввода
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#pragma once
#include <iostream>
#include "header.h"
class Array:
    public Container{
    private:
        char* data;
        int length;
    public:
        Array(int n){
        data=new char[n];
        length=n;
        }
        ~Array(){
        delete[] data;
        }
        void set(int j, char i){
        data[j]=i;
        }
         char get(int j){
        return data[j];
        }
        int len(){
        return length;
        }
        std::ostream& operator<<( std::ostream& os,Array& cont){
            for(int i=0;i<cont.len();i++){
                    os<<cont.get(i)<<"\t";
                os<<'\n';
            }
        return os;
        };
        std::stream& operator>>( std::istream& is,Array& cont){
            int m;
            std::cout<<"Insert Array length";
            char a;
            std::cin>>m;
            delete[] cont.data;
            cont.data=new char [m];
            for(int i=0;i<m;i++){
                std::cout<<"Insert"<<i<<"element";
            is>>a;
            cont.set(i,a);
            }
            return is;
        };
    }
;
header.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
32
33
34
#pragma once
#include <iostream>
class Container{
protected:
    virtual char get (int j)=0;
    virtual void set (int j, char i)=0;
    virtual int len()=0;
    virtual void swap(int i,int j){
        char t;
        t=this->get(i);
        this->set(i,this->get(j));
        this->set(j,t);
    }
    virtual void SortBubble()
      {
        for (int i=0; i<this->len(); i++)
        for (int j=this->len()-1; j>i; j--)
            if (this->get(j)<this->get(j-1))
            this->swap(j, j-1);
      }
    virtual void SortChoise()
      {
        for (int i=0; i<this->len(); i++)
          {
            int k=i;
            for (int j=i+1; j<this->len(); j++)
                if (this->get(j)<this->get(k))
                     k=j;
            if (i!=k)
              this->swap(i, k);
          }
      }
 
};
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include "Header.h"
#include "Array.h"
using namespace std;
 
int main()
{
    Array a();
    std::cin>>a;
    return 0;
}
При компиляции MinGW пишет */main.cpp:9: ошибка: ambiguous overload for 'operator>>' in 'std::cin >> a'. Помогите решить проблему, очень прошу ))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2013, 10:29     Перегрузка оператора ввода вывода
Посмотрите здесь:

перегрузка оператора ввода >> C++
Перегрузка оператора вывода в поток C++
C++ перегрузка оператора вывода
C++ Перегрузка оператора вывода
C++ Перегрузка оператора вывода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
28.04.2013, 10:46     Перегрузка оператора ввода вывода #2
Цитата Сообщение от Linzman Посмотреть сообщение
std::ostream& operator<<( std::ostream& os,Array& cont)
он должен быть другом, а не членом. (и >> тоже)
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
28.04.2013, 11:05  [ТС]     Перегрузка оператора ввода вывода #3
Подправил, 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#pragma once
#include <iostream>
#include "Header.h"
class Array:
    public Container{
    private:
        char* data;
        int length;
    public:
        Array(int n){
        data=new char[n];
        length=n;
        }
        ~Array(){
        delete[] data;
        }
        void set(int j, char i){
        data[j]=i;
        }
         char get(int j){
        return data[j];
        }
        int len(){
        return length;
        }
        friend std::ostream& operator<<( std::ostream& os,Array& cont){
            for(int i=0;i<cont.len();i++){
                    os<<cont.get(i)<<"\t";
                os<<'\n';
            }
        return os;
        };
        friend std::istream& operator>>( std::istream& is,Array& cont){
            int m;
            std::cout<<"Insert Array length";
            char a;
            std::cin>>m;
            delete[] cont.data;
            cont.data=new char [m];
            for(int i=0;i<m;i++){
                std::cout<<"Insert"<<i<<"element";
            is>>a;
            cont.set(i,a);
            }
            return is;
        };
    }
;
Проблема осталась таже
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
28.04.2013, 11:06     Перегрузка оператора ввода вывода #4
Linzman, друзья должны определятся вне класса.
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
28.04.2013, 12:31  [ТС]     Перегрузка оператора ввода вывода #5
SeregaC++, сделал как вы сказали. 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#pragma once
#include <iostream>
#include "Header.h"
class Array:
    public Container{
    private:
        char* data;
        int length;
    public:
        Array(int n){
        data=new char[n];
        length=n;
        }
        ~Array(){
        delete[] data;
        }
        void set(int j, char i){
        data[j]=i;
        }
         char get(int j){
        return data[j];
        }
        int len(){
        return length;
        }
        friend std::ostream& operator<<( std::ostream& os,Array& cont);
        friend std::istream& operator>>( std::istream& is,Array& cont);
    }
std::ostream& operator<<(std::ostream& os,Array& cont){
    int m;
   std::cout<<"Insert Array length";
   char a;
   std::cin>>m;
   delete[] cont.data;
   cont.data=new char [m];
   for(int i=0;i<m;i++){
       std::cout<<"Insert"<<i<<"element";
       is>>a;
       cont.set(i,a);
   }
   return is;
}
std::istream& operator>>( std::istream& is,Array& cont){
    for(int i=0;i<cont.len();i++){
        os<<cont.get(i)<<"\t";
        os<<'\n';
    }
return os;
}
выскакивает ошибка компиляции /home/practolog/Simple_Database/Array.h:29: ошибка: expected initializer before '&' token. Подскажите пожалуйста чайнику
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
28.04.2013, 12:48     Перегрузка оператора ввода вывода #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
#include <iostream>
#include <fstream>
#include <string>
 
struct People
{
    int years;
    std::string name;
    friend std::ostream &operator << (std::ostream &output, People& p);
    friend std::istream &operator >> (std::istream &input, People& p);
};
 
std::ostream &operator << (std::ostream &output, People& p)
{
    return output << p.name << " " << p.years;
}
 
std::istream &operator >> (std::istream &input, People& p)
{
    input >> p.name >> p.years;
 
    return input;
}
 
void load(std::ifstream& in, People* p)
{
    for(size_t i = 0; !in.eof(); ++i)
        in >> p[i];
}
 
int main()
{
    People p[10];
 
    std::ifstream in("in.txt");
 
    load(in, p);
 
    std::cout << p[3] << std::endl;
 
    return 0;
}
in.txt
C++
1
2
3
4
name 1
name 2
name 3
name 4
Попробуйте по аналогии
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
28.04.2013, 14:06  [ТС]     Перегрузка оператора ввода вывода #7
GetVariable, сделал все по типу.
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
#pragma once
#include <iostream>
#include "Header.h"
class Array:
    public Container{
    private:
        char* data;
        int length;
    public:
        Array(int n){
        data=new char[n];
        length=n;
        }
        ~Array(){
        delete[] data;
        }
        void set(int j, char i){
        data[j]=i;
        }
         char get(int j){
        return data[j];
        }
        int len(){
        return length;
        }
        friend std::ostream &operator<<( std::ostream& os,Array& cont);
        friend std::istream &operator>>( std::istream& is,Array& cont);
    };
std::istream &operator>>(std::ostream& is,Array& cont){
    int m;
   std::cout<<"Insert Array length";
   char a;
   std::cin>>m;
   delete[] cont.data;
   cont.data=new char [m];
   for(int i=0;i<m;i++){
       std::cout<<"Insert"<<i<<"element";
       is>>a;
       cont.set(i,a);
   }
   return is;
}
std::ostream &operator<<( std::istream& os,Array& cont){
    for(int i=0;i<cont.len();i++){
        os<<cont.get(i)<<"\t";
        os<<'\n';
    }
return os;
}
Ругается теперь что *data приватное поле, хотя доступается друг.
*/Array.h:7: ошибка: 'char* Array::data' is private
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
28.04.2013, 14:26     Перегрузка оператора ввода вывода #8
сделайте не private, а protected, если не получится. задайте сеттары и геттары и ими манипулируйте.
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
28.04.2013, 19:36  [ТС]     Перегрузка оператора ввода вывода #9
GetVariable, Если делать без наследования от Container то все работает. Ваш пример без наследования

Добавлено через 3 часа 18 минут
Подскажите пожалуйста какая ошибка в наследовании может быть
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.04.2013, 19:49     Перегрузка оператора ввода вывода #10
есть прием с перевызовом виртуальной функции. функция просто принимает в себя стрим и делает то, что
обычно делают в операторе <<. тут не нужно заморачиваться с френдами, с недоступностью данных из-за их приватности и с производными классами тоже нет проблем. Вот пример с operator <<. Оператор >> делается по аналогии:
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
#include <iostream>
 
class Base
{
public:
  virtual void Print(std::ostream& out) const
  {
    out << "This is Base";
  }
};
 
std::ostream& operator << (std::ostream& out, const Base& base)
{
  // тут просто вызываем виртуальную
  // функцию базового класса и это
  // будет корректно работать и для
  // всех наследниках, о которых в
  // этом месте кода вообще ничего не
  // известно.
  base.Print(out);
  return out;
}
 
 
class Der1 : public Base
{
public:
  virtual void Print(std::ostream& out) const
  {
    out << "This is Der1";
  }
};
 
class Der2 : public Base
{
public:
  virtual void Print(std::ostream& out) const
  {
    out << "This is Der2";
  }
};
 
 
int main()
{
 
  Base base;
  Der1 der1;
  Der2 der2;
 
  std::cout << base << std::endl;
  std::cout << der1 << std::endl;
  std::cout << der2 << std::endl;
 
  Base& ref1 = base;
  Base& ref2 = der1;
  Base& ref3 = der2;
 
  std::cout << ref1 << std::endl;
  std::cout << ref2 << std::endl;
  std::cout << ref3 << std::endl;
 
 
  return 0;
}
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
29.04.2013, 15:14  [ТС]     Перегрузка оператора ввода вывода #11
Всем спасибо, проблема оказалась в конструкторе Array(). Когда в main'е я инициализировал переменную так
C++
1
Array a()
компилятор писал error: ambiguous overload for ‘operator>>’ in ‘std::cin >>a'. Когда же я писал
C++
1
Array a(0)
все работало.
И все таки хочется узнать мнение эксперта почему так, как объявлять правильно "пустой" конструктор Array() и не приведет ли использование вместо него конструктора Array(0) к утечкам.
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
29.04.2013, 16:31     Перегрузка оператора ввода вывода #12
Linzman, я конечно не эксперт, но по твоему коду видно, что конструктор у тебя "преобразования" ( Array(int n)), значит его нельзя вызывать без параметров. Можешь сделать так:
C++
1
 Array(int n = 0)
и тогда такая конструкция будет работоспособна.
C++
1
Array a;
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
29.04.2013, 17:18  [ТС]     Перегрузка оператора ввода вывода #13
SeregaC++, а разве конструктор Array() не создается по умолчанию ?

Добавлено через 2 минуты
А использование Array(0) к утечке же не должно привести ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2013, 17:31     Перегрузка оператора ввода вывода
Еще ссылки по теме:

Перегрузка оператора вывода C++
C++ Перегрузка оператора ввода ,вывода
Перегрузка оператора вывода C++

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

Или воспользуйтесь поиском по форуму:
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
29.04.2013, 17:31     Перегрузка оператора ввода вывода #14
Цитата Сообщение от Linzman Посмотреть сообщение
а разве конструктор Array() не создается по умолчанию ?
он создасться только в том случае, если в твоем классе не будет переопределенно собственных конструкторов. Т.е в твоем случае он не создасться.

Добавлено через 1 минуту
Цитата Сообщение от Linzman Посмотреть сообщение
А использование Array(0) к утечке же не должно привести ?
я думаю, что нет.
Yandex
Объявления
29.04.2013, 17:31     Перегрузка оператора ввода вывода
Ответ Создать тему
Опции темы

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