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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 5.00
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
01.03.2012, 23:47     Как перегрузить ">>" в приложенном коде #1
как собстно перегрузить >> в данном примере?
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++ в заданном двоичном коде заменить все цифры "0" на "1" и наоборот
Создать класс "Триада" и перегрузить некоторые операторы C++
C++ Подскажите как перегрузить операторы ">>", "<<" и "="
C++ Как отключить автоматическое добавление "_" "@" "number" к имени экстернального метода?
C++ Перегрузить "operator -" так, чтобы из вектора удалялся элемент, присутствующий во втором векторе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
02.03.2012, 00:40     Как перегрузить ">>" в приложенном коде #2
смотри Написать функцию PrnStruct() с одним параметром типа TMyStruct, выводящую на печать значения полей структуры.
friend-ция как я помню реализуется вне, чтоб она была видна другим классам
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
02.03.2012, 01:07  [ТС]     Как перегрузить ">>" в приложенном коде #3
Avazart, вы наверное не так прочитали задание: я то перегрузил оператор, но у меня память под имя выделяется динамически, отсюда и проблема.
KeyGen
 Аватар для KeyGen
333 / 289 / 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
 Аватар для diagon
1920 / 1186 / 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
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
02.03.2012, 23:29  [ТС]     Как перегрузить ">>" в приложенном коде #9
ForEveR, а как такое реализовано в том же string-e?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.03.2012, 10:09     Как перегрузить ">>" в приложенном коде #10
Цитата Сообщение от Mayonez Посмотреть сообщение
ForEveR, а как такое реализовано в том же string-e?
Там вроде считывается посимвольно, если заканчивается память, выделенная под строку, то выделяется больший кусок памяти и строка переезжает туда.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.03.2012, 10:28     Как перегрузить ">>" в приложенном коде #13
А после конца ввода лишняя память усекается?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.03.2012, 11:00     Как перегрузить ">>" в приложенном коде #14
Цитата Сообщение от Toshkarik Посмотреть сообщение
А после конца ввода лишняя память усекается?
Какая лишняя память? Та, в которой хранилась старая строка освобождается.
P.S. в gcc немного по другому сделано, там читаются куски по 128 байт, и эти куски добавляются к итоговой строке. Ну а добавляются так, как уже было сказано.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.03.2012, 11:11     Как перегрузить ">>" в приложенном коде #15
Немного не понял, вы говорили, что считывается посимвольно. Вот мы ввели последний вмещающийся символ, после чего при вводе следующего, выделяется новая память, и как сказано было не на 1 символ, а например в 2 раза. При этом из этих "в 2 раза" реально нужно скажем половина, то есть 1/2 от "в 2 раза". После конца ввода что происходит со второй 1/2?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.03.2012, 11:20     Как перегрузить ">>" в приложенном коде #16
Цитата Сообщение от Toshkarik Посмотреть сообщение
После конца ввода что происходит со второй 1\2?
Ну а что с ней может сделаться? Остается выделенной.
У string есть метод size(), который показывает размер используемой памяти, а также метод capacity(), который показывает количество выделенной памяти(т.е. считается также неиспользуемая память).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2012, 18:07     Как перегрузить ">>" в приложенном коде
Еще ссылки по теме:

C++ Создать класс "прямоугольник" и перегрузить операцию отношения "равно"
Патерн "прототип" не работает, выдаёт ошибку "недопустимый вызов нестатической ф-ции", где я в коде ошибка? C++
C++ Перегрузить оператор "-" таким образом, чтобы при работе с массивами он поэлементно их вычитал

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.03.2012, 18:07     Как перегрузить ">>" в приложенном коде #17
Цитата Сообщение от diagon Посмотреть сообщение
Ну а что с ней может сделаться? Остается выделенной.
Ясно, спасибо. Что-то как то не серьезно получается...
Yandex
Объявления
03.03.2012, 18:07     Как перегрузить ">>" в приложенном коде
Ответ Создать тему
Опции темы

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