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

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

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

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

01.03.2012, 23:47. Просмотров 889. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2012, 23:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как перегрузить ">>" в приложенном коде (C++):

Подскажите как перегрузить операторы ">>", "<<" и "=" - C++
Кто знает, подскажите как перегрузить операторы &quot;&gt;&gt;&quot;, &quot;&lt;&lt;&quot; и &quot;=&quot; ?

Перегрузить операторы "=", "+=" так, чтобы производилось сложение строки и объекта - C++
помогите ,пожалуйста вот задание:Реализовать класс String для работы со строками символов. Перегрузить операторы =, += так, чтобы...

Создать класс "прямоугольник" и перегрузить операцию отношения "равно" - C++
Помогите решить задачу: Создать класс &quot;прямоугольник&quot; и перегрузить операцию отношения равно (==). Заранее спасибо!

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

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Патерн "прототип" не работает, выдаёт ошибку "недопустимый вызов нестатической ф-ции", где я в коде ошибка? - C++
Вот мой код... #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;vector&gt; #define vrom vector&lt;room&gt; using namespace std; ...

16
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,805
Записей в блоге: 17
02.03.2012, 00:40 #2
смотри Написать функцию PrnStruct() с одним параметром типа TMyStruct, выводящую на печать значения полей структуры.
friend-ция как я помню реализуется вне, чтоб она была видна другим классам
0
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
02.03.2012, 01:07  [ТС] #3
Avazart, вы наверное не так прочитали задание: я то перегрузил оператор, но у меня память под имя выделяется динамически, отсюда и проблема.
0
KeyGen
384 / 291 / 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;
}
1
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;
}
1
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 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)); }
1
diagon
Higher
1929 / 1195 / 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;
        }
1
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
02.03.2012, 16:58 #8
ForEveR, спасибо, выходит заблуждался. В чём же тогда проблема в данном примере?=\
0
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
02.03.2012, 23:29  [ТС] #9
ForEveR, а как такое реализовано в том же string-e?
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.03.2012, 10:09 #10
Цитата Сообщение от Mayonez Посмотреть сообщение
ForEveR, а как такое реализовано в том же string-e?
Там вроде считывается посимвольно, если заканчивается память, выделенная под строку, то выделяется больший кусок памяти и строка переезжает туда.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
03.03.2012, 10:12 #11
На сколько больший? На символ?
0
Luke
39 / 39 / 1
Регистрация: 21.02.2012
Сообщений: 95
03.03.2012, 10:17 #12
Цитата Сообщение от Toshkarik Посмотреть сообщение
На сколько больший? На символ?
нет конечно. обычно блок увеличивается на некий коэффициент. например в 2 раза.
потому как если бы только на символ то это привело бы к бесконечно частому увеличению, при добавлении новых и новых символов и это уже не строка а телега была бы. а так, при закачке 1000 символов, всего то несколько раз строка переедет в новую память. а если ты еще и зарезервировал память предусмотрительно, до ее наполнения - то вообще может и ни разу
1
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
03.03.2012, 10:28 #13
А после конца ввода лишняя память усекается?
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.03.2012, 11:00 #14
Цитата Сообщение от Toshkarik Посмотреть сообщение
А после конца ввода лишняя память усекается?
Какая лишняя память? Та, в которой хранилась старая строка освобождается.
P.S. в gcc немного по другому сделано, там читаются куски по 128 байт, и эти куски добавляются к итоговой строке. Ну а добавляются так, как уже было сказано.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
03.03.2012, 11:11 #15
Немного не понял, вы говорили, что считывается посимвольно. Вот мы ввели последний вмещающийся символ, после чего при вводе следующего, выделяется новая память, и как сказано было не на 1 символ, а например в 2 раза. При этом из этих "в 2 раза" реально нужно скажем половина, то есть 1/2 от "в 2 раза". После конца ввода что происходит со второй 1/2?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2012, 11:11
Привет! Вот еще темы с ответами:

Error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "код операции"; обнаружено "SHL" - C++
visual studio выдал такую ошибку error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в &quot;код операции&quot;; обнаружено...

В заданном двоичном коде заменить все цифры "0" на "1" и наоборот - C++
составить алгоритм который в заданном двоичном коде заменяет все цифры &quot;0&quot; на &quot;1&quot; и наоборот

Создать класс "Триада" и перегрузить некоторые операторы - C++
1) Создать базовый класс &quot;Триада&quot; (три числа). Определить методы: конструктор, виртуальные функции увеличения полей на 1 и вывода...

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


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
03.03.2012, 11:11
Ответ Создать тему
Опции темы

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