Поиск:

Ответ в темуСоздание новой темы Создание опроса
> cout, перегрузка operator<< 
V
    Опции темы
fish9370
Дата 12.6.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



хочу сделать аналог cout из библиотеки <iostram.h>.. есть класс в нем хочу перегрузить operator<< так, чтобы функция вызывала сама себя рекурсивно с новыми параметрами.. есть у кого-то готовый примерчик как это реализуется?

типа так: 

Код

console << "te" << "st";

чтобы получалось: test




--------------------
undefined
PM MAIL WWW ICQ   Вверх
Ulysses4j
Дата 12.6.2007, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: нет
Всего: 10



Здесь не нужна никакая рекурсия. Реализация по образу:
Код
Console operator<<(Console с, std::string s) {
  // implementation..
  return c;
}

позволит работать так, как работает operator<< для библиотечных типов. Данная функция должна быть свободной и находиться в одном пространстве имен с Console - чтобы использовалось ADL.

Это сообщение отредактировал(а) Ulysses4j - 12.6.2007, 21:02


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
fish9370
Дата 12.6.2007, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



спасибо сейчас попробую..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
fish9370
Дата 12.6.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



Код

_console _console::operator<<(_console c, char *szString)
{
    Write(szString);
    return c;
}


этот код приводит к ошибке [C++ Error] console.h(31): E2080 '_console::operator <<(_console,char *)' must be declared with one parameter
т.е. оператору должен быть передан лишь один параметр.. или я что-то неправильно понял?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 12.6.2007, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



а не надо её в классе объявлять - делать, как обычную функцию


--------------------
qqq
PM WWW   Вверх
fish9370
Дата 12.6.2007, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



Цитата(maxim1000 @ 12.6.2007,  21:32)
а не надо её в классе объявлять - делать, как обычную функцию

понимаешь, если бы мне было достаточно просто выводить абы как я бы реализовал по принципу printf.. но я не готов идти на компромисы.. если это есть в cout значит это можно сделать.. или они читеры?  smile 

Это сообщение отредактировал(а) fish9370 - 12.6.2007, 21:38


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Ulysses4j
Дата 12.6.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: нет
Всего: 10



Цитата(fish9370 @  12.6.2007,  22:35 Найти цитируемый пост)
если это есть в cout значит это можно сделать.. 

Для cout именно определена соответствующая свободная функция operator<<( ostream os, string s ) (грубо гвооря, но тут этого достаточно). Если нужен доступ к реализации Console, сделайте сделайте ваш оператор friend.

Это сообщение отредактировал(а) Ulysses4j - 12.6.2007, 21:57


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
fish9370
Дата 12.6.2007, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



наверно я просто везучий, но я нашел правильное решение.. все-таки метод научного тыка это сила..  smile 

Код

_console _console::operator<<(char *szString)
{
    Write(szString);
    return *this;
}


как видете все бонально..

Это сообщение отредактировал(а) fish9370 - 12.6.2007, 22:09


--------------------
undefined
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 12.6.2007, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



Цитата(fish9370 @  12.6.2007,  21:35 Найти цитируемый пост)
понимаешь, если бы мне было достаточно просто выводить абы как я бы реализовал по принципу printf.. но я не готов идти на компромисы.. если это есть в cout значит это можно сделать..

я имел в виду глобально объявить этот самый operator<<
не как член класса
в принципе, когда такие его версии делаются для встроенных типов, то можно и так, и так
однако, когда начинают появляться новые классы, которые хотят выводиться в этот объект с помощью того же оператора, вариант с объявлением внутри не подходит, т.к. придётся менять класс _console при появлении каждого нового выводимого класса
поэтому в качестве общего подхода проще использовать внешние объявления


--------------------
qqq
PM WWW   Вверх
fish9370
Дата 13.6.2007, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



Цитата(maxim1000 @ 12.6.2007,  23:22)
однако, когда начинают появляться новые классы, которые хотят выводиться в этот объект с помощью того же оператора, вариант с объявлением внутри не подходит, т.к. придётся менять класс _console при появлении каждого нового выводимого класса
поэтому в качестве общего подхода проще использовать внешние объявления

я абсолютно не согласен.. ведь если тебе потребуется передать в эту функцию какой-то новый класс, ты будешь перегружать ее для поддержки этого класса.. и я сделаю так же, но в классе.. у меня законченая конструкция абсолютно независящая ни от чего.. теперь мне создать консоль дело пары кликов..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 13.6.2007, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



пример того, что я имею в виду:
console.h (в cpp или тут же реализация, для данного вопроса неважно):
Код

class _console
{
...
public:
    _console &operator<<(char *str);
...
};

потом этот класс начинают использовать в проекте, где есть понятие, например, дерева, которое хотят выводить простой строчкой:
Код

    console<<tree;

это можно сделать двумся способами:
1. добавить новый метод operator<< в _console:
console.h
Код

class _console
{
...
public:
    _console &operator<<(char *str);
    _console &operator<<(_tree &tree);
...
};
(предполагается, что _tree - класс описывающий дерево)

2. описать в одном из файлов этого проекта по работе с деревьями такую функцию:
Код

_console &operator(_console &console,_tree &tree)
{
...
}


работать будут оба варианта
почему я считаю первый вариант хуже:
он требует изменения console.h
дело в том, что _console вполне может пригодиться в нескольких проектах одновременно
один проект будет работать с деревьями, второй, например, с таблицами чисел (которые тоже захочется выводить чем-то типа "console<<table;")
если использовать первый способ, то в описание класса _console нужно будет добавить и operator<<(_tree&), и operator<<(_table&)
в то же время console.h подключается в оба проекта
получается, что первый проект (с деревьями) должен знать про таблицы, а второй (с таблицами) - про деревья, и с ростом количества выводимых объектов и проектов вообще количество этих связей будет расти, при чём даже нелинейно
более того, когда мы захотим поделиться классом _console с другими, нам придётся отдавать вместе с ним и tree.h, и table.h и заставлять людей подключать их в свои проекты

второй способ предполагает, что console.h содержит минимум operator<< для встроенных типов
а все остальные операторы вывода добавляются снаружи, не изменяя класс _console


--------------------
qqq
PM WWW   Вверх
fish9370
Дата 18.6.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



я предпочитаю второй способ.. мне и нужно было выводить стандарнтные типы.. 
усложнять с другими более сложными объектами не вижу смысла.. иначе класс перестанет быть универсальным.. кому надо сделает это снаружи..  кому понадобится - унаследует и перегрузит класс..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0967 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.