Russian Qt Forum
Ноябрь 24, 2024, 07:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подстновка функции в саму себя  (Прочитано 4461 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Август 28, 2009, 13:51 »

Доброго времени суток!

Например имеется функция : int read(char* data, int len)
и её нужно подставить в саму себя
Код:
int read(char* data, int len) {  //№1
 тут выполняем чтение и т.п
}

теперь её подставляем

int read(char* data, int len) {  //№2
...
    for(;;) {
        int newLen = ...;
        int ret = read((void*)(data+n), newLen );
        ...
    }
...
}

т.е. чтобы не реализовывать новую функцию №2 с другим именем, могу ли я реализации №1 и №2 написать с одним именем?
и что нужно, чтобы сработала подстановка?

примерчик пожалуйста Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
BRE
Гость
« Ответ #1 : Август 28, 2009, 13:56 »

Не совсем понял мысль...
У тебя есть функция read (#1) и ты хочешь написать вторую функцию read (#2) с тем-же именем и параметрами в которой будешь использовать #1?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Август 28, 2009, 13:58 »

дадада Улыбающийся

т.е конечной должна быть функция №2 , просто мне не хочется в теле ф №2 писать код от ф №1 , и не хочется в хейдере определять 2 функции!

т.е в хедере должна быть одна ф-я : int read(char* data, int len)


Улыбающийся или это нереально?

« Последнее редактирование: Август 28, 2009, 14:00 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
BRE
Гость
« Ответ #3 : Август 28, 2009, 14:03 »

дадада Улыбающийся
В одном пространстве имен - нет.
А так функции можно разнести в разные пространства имен/разные классы.

Код
C++ (Qt)
namespace internal
{
 
int read(char* data, int len)
{
   ...
}
 
}
 
int read(char* data, int len)
{
...
   for(;;) {
       int newLen = ...;
       int ret = internal::read((void*)(data+n), newLen );
       ...
   }
...
}
 
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Август 28, 2009, 14:10 »

Спасибо, понятно...
Записан

ArchLinux x86_64 / Win10 64 bit
Winstrol
Гость
« Ответ #5 : Август 28, 2009, 14:51 »

Создавать две функции с одним и тем же именем, но разным телом нельзя.
Но можно в клиентском коде, где собираешься использовать read переопределить ее имя с помощью препроцессора на свое.
#define read myread.
А в реализации myread с чистой совестью вызывать стандартный read.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Август 28, 2009, 20:30 »

т.е. чтобы не реализовывать новую функцию №2 с другим именем, могу ли я реализации №1 и №2 написать с одним именем?
и что нужно, чтобы сработала подстановка?

примерчик пожалуйста Улыбающийся
Можете.

int read( char * dst, int len ) {...}
int read( void * dst, int len ) {...}

Но в С++ это просто 2 разные функции и никакой подстановки нет. Практически это приносит только неудобства - все время надо помнить "который read"
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.066 секунд. Запросов: 22.