forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Объясните пожалуйста перегрузку оператора << (http://forum.boolean.name/showthread.php?t=13018)

HAMANN 27.07.2010 21:14

Объясните пожалуйста перегрузку оператора <<
 
вот код....

Код:

#include <iostream.h>

char* v;

class string
{
        private:
                char* data;
        public:
        string(char* value_)
        {
                int b = 0;
                char value__ = ' ';
               
                while(value__ != 0)
                        value__ = value_[b++];
                       
                this->data = (char*)realloc(this->data, b);
                for(int c = 0; c < b; ++c)
                        this->data[c] = value_[c];
        }
       
        void echo()
        {
                cout << this->data << endl;
        }
       
        istream& operator << (istream& stream,string& obj)
        {
                stream << obj.data;
               
                return stream;
        }
};

string str = "123456789";

int main()
{
        cout << str << endl;;
        std::cin >> v;
}

что не правильно в перегрузке?

HolyDel 28.07.2010 00:23

Ответ: Объясните пожалуйста перегрузку оператора <<
 
во первых оператор << перегружается внешне, если-бы он перегружался внутренне, надо было бы писать somestring<<cout; (у тебя получается что ему передается ТРИ параметра, два тобой явно указаны, а третий - string*, котрый this.

кстати, судя по реализации, тебе нао перегружать >> не?

Код:

#include <iostream>
#include <cstdlib>

char* v;

class string
{
        private:
                char* data;
        public:
        string(char* value_)
        {
                int b = 0;
                char value__ = ' ';

                while(value__ != 0)
                        value__ = value_[b++];

                this->data = (char*)realloc(this->data, b);
                for(int c = 0; c < b; ++c)
                        this->data[c] = value_[c];
        }

        void echo()
        {
                std::cout << this->data << std::endl;
        }

        friend std::ostream& operator<<(std::ostream& stream,string& obj);
};

std::ostream& operator<<(std::ostream& stream,string& obj)
{
    stream << obj.data;

    return stream;
}

string str = "123456789";

int main()
{
        std::cout << str << std::endl;;
        std::cin >> v;
}

теперь собственно придирки:
1. char *v - глобальная переменная. совершенно ненужная причем.

2. value__ - двойное подчеркивание зарезервированно компиляторами и стандартной библиотекой, не стоит его использовать в своих именах.

3.
while(value__ != 0)
value__ = value_[b++];
не проще ли было просто написать:
while(value_[b++])?? или даже еще лучше:
b = strlen(value_)

4. самое главное - что за тупой, не, ТУПОЙ, realloc? понтанулся что знаешь такую команду? или зачем? ты вкурсе что у тебя в data на момент вызова realloc-а, мусор? вот поситай: http://www.codenet.ru/progr/cpp/spru/realloc.php
malloc и все тут.
еще лучше new char[b];
по крайней мее так твоя программа не валится.

5. приведение типа в старом стиле ненужны. учи static, reinterpret, const и dynamic cast-ы. если не хочешь учить - используй static_cast заместо приведения в старом стиле.


Часовой пояс GMT +4, время: 11:36.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot