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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 5.00
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
#1

Как перегрузить ">>" в приложенном коде - C++

01.03.2012, 23:47. Просмотров 878. Ответов 16
Метки нет (Все метки)

как собстно перегрузить >> в данном примере?
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
#include <iostream>
#include <cstring>
 
using namespace std;
 
class Person
{
public:
    Person() 
    {
        cout << "Constructor Person called" << endl;
        name = 0; // name = nullptr;
        //нужно ведь?
    }
    Person(const char* _name)
    {
        name = new char[strlen(_name) + 1];
        strcpy(name, _name);
    }
    ~Person()
    {
        cout << "Destructor Person called" << endl;
        if(name)
            delete [] name;
    }
    //можно ведь реализацию внутри класса?
    friend ostream& operator<<(ostream& out, const Person& p)
    {
        out << p.name << endl;
        return out;
    }
    friend istream& operator>>(istream& in, Person& p)
    {
        //как сделать?
        in >> p.name;
        return in;
    }
protected:
    char* name;
};
 
int main()
{
    //All is OK!
    Person p("Greg");
    cout << p << endl;
    cin  >> p;
    cout << p << endl;
    
    
    Person g;
    cin  >> g; //ooops!
    cout << g; 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2012, 23:47     Как перегрузить ">>" в приложенном коде
Посмотрите здесь:

Как перегрузить оператор "+" для шаблонного класса, инстанцированного разными типами? - C++
подскажите как перегрузить оператор &quot;+&quot; для шаблона , инстанцированных разными типами ...

Перегрузить операторы "+" для комплексных чисел: - C++
Перегрузить операторы + для комплексных чисел: А) Сделать функцию перегрузки оператора &quot;+&quot; дружественной класса. Б) Сделать функцию...

Создать класс "Строка" и перегрузить операторы - C++
Написать код программы на С++ Создать класс СТРОКА. Для данного класса реализовать метод вывода строки на экран, перегрузить следующие...

Перегрузить "operator -" так, чтобы из вектора удалялся элемент, присутствующий во втором векторе - C++
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; typedef unsigned int...

Перегрузить оператор "-" таким образом, чтобы при работе с массивами он поэлементно их вычитал - C++
И снова всем привет. Снова практикуюсь в написании кода. Теперь задача заключается в следующем: Надо перегрузить оператор &quot;-&quot; таким...

Как работает функция "test" в приведенном коде - C++
Объясните как работает функция test #include &lt;conio.h&gt; #include &lt;iostream.h&gt; #include &lt;limits.h&gt; int test(long int a) ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
Эксперт С++
7121 / 5298 / 273
Регистрация: 10.12.2010
Сообщений: 23,436
Записей в блоге: 17
02.03.2012, 00:40     Как перегрузить ">>" в приложенном коде #2
смотри Написать функцию PrnStruct() с одним параметром типа TMyStruct, выводящую на печать значения полей структуры.
friend-ция как я помню реализуется вне, чтоб она была видна другим классам
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
02.03.2012, 01:07  [ТС]     Как перегрузить ">>" в приложенном коде #3
Avazart, вы наверное не так прочитали задание: я то перегрузил оператор, но у меня память под имя выделяется динамически, отсюда и проблема.
KeyGen
383 / 290 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
02.03.2012, 01:08     Как перегрузить ">>" в приложенном коде #4
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
#include <iostream>
#include <cstring>
 
using namespace std;
 
class Person
{
protected:
        char* name;
 
public:
        Person() 
        {
                cout << "Constructor Person called" << endl;
                name = 0; // name = nullptr;
                //нужно ведь?
        }
        Person(const char* _name)
        {
                name = new char[strlen(_name) + 1];
                strcpy(name, _name);
        }
        ~Person()
        {
                cout << "Destructor Person called" << endl;
                if(name)
                        delete [] name;
        }
        //можно ведь реализацию внутри класса?
        friend ostream& operator<<(ostream& out, const Person& p)
        {
                out << p.name << endl;
                return out;
        }
        friend istream& operator>>(istream& in, Person& p)
        {
    char mas[80];
    in.get(mas, 80);
    if(in)
        p=mas;
    while(in && in.get() != '\n')
        continue;
    return in;
        }
};
 
int main()
{
        //All is OK!
        Person p("Greg");
        cout << p << endl;
        cin  >> p;
        cout << p << endl;
        
        
        Person g;
        cin  >> g; //ooops!
        cout << g; 
        return 0;
}
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
02.03.2012, 01:23     Как перегрузить ">>" в приложенном коде #5
Если используешь iostream, значит можно и string подключить, ибо оба из стандартной библиотеки. Лучше все строки хранить именно в string'e, но если принципиально нужен char*, то можно наверное и так извратиться:
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
#include <iostream>
#include <cstring>
#include <string>
 
using namespace std;
 
class Person
{
public:
        Person() 
        {
                cout << "Constructor Person called" << endl;
                name = NULL; // name = nullptr;
                //нужно ведь? - Весьма желательно
        }
        Person(const char* _name)
        {
                name = new char[strlen(_name) + 1];
                strcpy(name, _name);
        }
        ~Person()
        {
                cout << "Destructor Person called" << endl;
                if(name != NULL)
                        delete [] name;
        }
        //можно ведь реализацию внутри класса? - Да
        friend ostream& operator<<(ostream& out, Person& obj)
        {
                out << obj.name << endl;
                return out;
        }
        friend istream& operator>>(istream& in, Person& obj)
        {
             string buf;
             // Твоя версия не рабочая тк нет перегруженного оператора ">>" у ifstream, который бы мог обеспечить ввод для char*
             // Ну ум пришла такая заплатка(лучше конечно использовать в классе не char* name, а string name):
             in >> buf;
             if (obj.name != NULL) delete []obj.name;
             obj.name = new char [buf.size() + 1];
             strcpy(obj.name, buf.c_str());
             obj.name[buf.size()] = '\0';
             return in;
        }
protected:
        char* name;
};
 
int main()
{
        //All is OK!
        Person p("Greg");
        cout << p << endl;
        cin  >> p;
        cout << p << endl;
        
        
        Person g;
        cin  >> g;
        cout << g; 
        system("pause");
        return 0;
}
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
02.03.2012, 14:07     Как перегрузить ">>" в приложенном коде #6
Whiteha, Таки ложь.

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
  //@{
  /**
   *  @brief  Character string extractors
   *  @param  in  An input stream.
   *  @param  s  A pointer to a character array.
   *  @return  in
   *
   *  Behaves like one of the formatted arithmetic extractors described in
   *  std::basic_istream.  After constructing a sentry object with good
   *  status, this function extracts up to @c n characters and stores them
   *  into the array starting at @a s.  @c n is defined as:
   *
   *  - if @c width() is greater than zero, @c n is width() otherwise
   *  - @c n is <em>the number of elements of the largest array of *
   *  - @c char_type that can store a terminating @c eos.</em>
   *  - [27.6.1.2.3]/6
   *
   *  Characters are extracted and stored until one of the following happens:
   *  - @c n-1 characters are stored
   *  - EOF is reached
   *  - the next character is whitespace according to the current locale
   *  - the next character is a null byte (i.e., @c charT() )
   *
   *  @c width(0) is then called for the input stream.
   *
   *  If no characters are extracted, sets failbit.
  */
  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s);
 
  // Explicit specialization declaration, defined in src/istream.cc.
  template<>
    basic_istream<char>&
    operator>>(basic_istream<char>& __in, char* __s);
 
  template<class _Traits>
    inline basic_istream<char, _Traits>&
    operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s)
    { return (__in >> reinterpret_cast<char*>(__s)); }
 
  template<class _Traits>
    inline basic_istream<char, _Traits>&
    operator>>(basic_istream<char, _Traits>& __in, signed char* __s)
    { return (__in >> reinterpret_cast<char*>(__s)); }
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
02.03.2012, 14:48     Как перегрузить ">>" в приложенном коде #7
Так как-то
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
friend istream& operator>>(istream& in, Person& p)
        {
                //как сделать?
                static char s[100500] = "\0";
                in >> s;
                unsigned slen = strlen(s);
                if ( !p.name || slen > strlen(p.name) )
                {
                    if (p.name)
                        delete[] p.name;
                    
                    p.name = new char[ slen + 1 ];
                }
                
                strcpy( p.name, s );
                return in;
        }
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
02.03.2012, 16:58     Как перегрузить ">>" в приложенном коде #8
ForEveR, спасибо, выходит заблуждался. В чём же тогда проблема в данном примере?=\
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
02.03.2012, 23:29  [ТС]     Как перегрузить ">>" в приложенном коде #9
ForEveR, а как такое реализовано в том же string-e?
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.03.2012, 10:09     Как перегрузить ">>" в приложенном коде #10
Цитата Сообщение от Mayonez Посмотреть сообщение
ForEveR, а как такое реализовано в том же string-e?
Там вроде считывается посимвольно, если заканчивается память, выделенная под строку, то выделяется больший кусок памяти и строка переезжает туда.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
03.03.2012, 10:12     Как перегрузить ">>" в приложенном коде #11
На сколько больший? На символ?
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
03.03.2012, 10:17     Как перегрузить ">>" в приложенном коде #12
Цитата Сообщение от Toshkarik Посмотреть сообщение
На сколько больший? На символ?
нет конечно. обычно блок увеличивается на некий коэффициент. например в 2 раза.
потому как если бы только на символ то это привело бы к бесконечно частому увеличению, при добавлении новых и новых символов и это уже не строка а телега была бы. а так, при закачке 1000 символов, всего то несколько раз строка переедет в новую память. а если ты еще и зарезервировал память предусмотрительно, до ее наполнения - то вообще может и ни разу
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
03.03.2012, 10:28     Как перегрузить ">>" в приложенном коде #13
А после конца ввода лишняя память усекается?
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.03.2012, 11:00     Как перегрузить ">>" в приложенном коде #14
Цитата Сообщение от Toshkarik Посмотреть сообщение
А после конца ввода лишняя память усекается?
Какая лишняя память? Та, в которой хранилась старая строка освобождается.
P.S. в gcc немного по другому сделано, там читаются куски по 128 байт, и эти куски добавляются к итоговой строке. Ну а добавляются так, как уже было сказано.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2012, 11:11     Как перегрузить ">>" в приложенном коде
Еще ссылки по теме:

Для чего в коде нужна строка "using namespace std"? - C++
у меня возникла проблема при удалении &quot;using namespace std;&quot; перестает работать cout точнее пишет Build FAILED. File2.cpp(11,6):...

Что за подсказки появляются после напечатанного в коде "std" - C++
Есть 3 файла #include &lt;iostream&gt; #ifndef move_h #define move_h namespace nm_move_ { class Move__

Ошибка в коде "вызвано срабатывание точки останова" - C++
Вот код на С++ По идее все должно работать, но мне выдается ошибка, которую я раньше не встречал, посмотрите пожалуйста, если получится...

Ошибка в коде: "использована неинициализированная локальная переменная" - C++
Я пытаюсь сделать программу, которая меняет отрицательный элемент с конца на положительный элемент с начала, предпоследний отрицательный со...


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

Или воспользуйтесь поиском по форуму:
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
03.03.2012, 11:11     Как перегрузить ">>" в приложенном коде #15
Немного не понял, вы говорили, что считывается посимвольно. Вот мы ввели последний вмещающийся символ, после чего при вводе следующего, выделяется новая память, и как сказано было не на 1 символ, а например в 2 раза. При этом из этих "в 2 раза" реально нужно скажем половина, то есть 1/2 от "в 2 раза". После конца ввода что происходит со второй 1/2?
Yandex
Объявления
03.03.2012, 11:11     Как перегрузить ">>" в приложенном коде
Ответ Создать тему
Опции темы

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