![]() |
|
![]() ![]() ![]() |
|
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
хочу сделать аналог cout из библиотеки <iostram.h>.. есть класс в нем хочу перегрузить operator<< так, чтобы функция вызывала сама себя рекурсивно с новыми параметрами.. есть у кого-то готовый примерчик как это реализуется?
типа так:
чтобы получалось: test -------------------- undefined |
|||
|
||||
Ulysses4j |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: нет Всего: 10 |
Здесь не нужна никакая рекурсия. Реализация по образу:
позволит работать так, как работает 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 |
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
спасибо сейчас попробую..
-------------------- undefined |
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
этот код приводит к ошибке [C++ Error] console.h(31): E2080 '_console::operator <<(_console,char *)' must be declared with one parameter т.е. оператору должен быть передан лишь один параметр.. или я что-то неправильно понял? -------------------- undefined |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: нет Всего: 110 |
а не надо её в классе объявлять - делать, как обычную функцию
-------------------- qqq |
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
понимаешь, если бы мне было достаточно просто выводить абы как я бы реализовал по принципу printf.. но я не готов идти на компромисы.. если это есть в cout значит это можно сделать.. или они читеры? ![]() Это сообщение отредактировал(а) fish9370 - 12.6.2007, 21:38 -------------------- undefined |
|||
|
||||
Ulysses4j |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: нет Всего: 10 |
Для 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 |
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
наверно я просто везучий, но я нашел правильное решение.. все-таки метод научного тыка это сила..
![]()
как видете все бонально.. Это сообщение отредактировал(а) fish9370 - 12.6.2007, 22:09 -------------------- undefined |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: нет Всего: 110 |
я имел в виду глобально объявить этот самый operator<< не как член класса в принципе, когда такие его версии делаются для встроенных типов, то можно и так, и так однако, когда начинают появляться новые классы, которые хотят выводиться в этот объект с помощью того же оператора, вариант с объявлением внутри не подходит, т.к. придётся менять класс _console при появлении каждого нового выводимого класса поэтому в качестве общего подхода проще использовать внешние объявления -------------------- qqq |
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
я абсолютно не согласен.. ведь если тебе потребуется передать в эту функцию какой-то новый класс, ты будешь перегружать ее для поддержки этого класса.. и я сделаю так же, но в классе.. у меня законченая конструкция абсолютно независящая ни от чего.. теперь мне создать консоль дело пары кликов.. -------------------- undefined |
|||
|
||||
maxim1000 |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: нет Всего: 110 |
пример того, что я имею в виду:
console.h (в cpp или тут же реализация, для данного вопроса неважно):
потом этот класс начинают использовать в проекте, где есть понятие, например, дерева, которое хотят выводить простой строчкой:
это можно сделать двумся способами: 1. добавить новый метод operator<< в _console: console.h
2. описать в одном из файлов этого проекта по работе с деревьями такую функцию:
работать будут оба варианта почему я считаю первый вариант хуже: он требует изменения console.h дело в том, что _console вполне может пригодиться в нескольких проектах одновременно один проект будет работать с деревьями, второй, например, с таблицами чисел (которые тоже захочется выводить чем-то типа "console<<table;") если использовать первый способ, то в описание класса _console нужно будет добавить и operator<<(_tree&), и operator<<(_table&) в то же время console.h подключается в оба проекта получается, что первый проект (с деревьями) должен знать про таблицы, а второй (с таблицами) - про деревья, и с ростом количества выводимых объектов и проектов вообще количество этих связей будет расти, при чём даже нелинейно более того, когда мы захотим поделиться классом _console с другими, нам придётся отдавать вместе с ним и tree.h, и table.h и заставлять людей подключать их в свои проекты второй способ предполагает, что console.h содержит минимум operator<< для встроенных типов а все остальные операторы вывода добавляются снаружи, не изменяя класс _console -------------------- qqq |
||||||||
|
|||||||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
я предпочитаю второй способ.. мне и нужно было выводить стандарнтные типы..
усложнять с другими более сложными объектами не вижу смысла.. иначе класс перестанет быть универсальным.. кому надо сделает это снаружи.. кому понадобится - унаследует и перегрузит класс.. -------------------- undefined |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |