Russian Qt Forum

Программирование => С/C++ => Тема начата: kuzulis от Август 28, 2009, 13:51



Название: Подстновка функции в саму себя
Отправлено: kuzulis от Август 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 написать с одним именем?
и что нужно, чтобы сработала подстановка?

примерчик пожалуйста :)


Название: Re: Подстновка функции в саму себя
Отправлено: BRE от Август 28, 2009, 13:56
Не совсем понял мысль...
У тебя есть функция read (#1) и ты хочешь написать вторую функцию read (#2) с тем-же именем и параметрами в которой будешь использовать #1?


Название: Re: Подстновка функции в саму себя
Отправлено: kuzulis от Август 28, 2009, 13:58
дадада :)

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

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


:) или это нереально?



Название: Re: Подстновка функции в саму себя
Отправлено: BRE от Август 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 );
       ...
   }
...
}
 


Название: Re: Подстновка функции в саму себя
Отправлено: kuzulis от Август 28, 2009, 14:10
Спасибо, понятно...


Название: Re: Подстновка функции в саму себя
Отправлено: Winstrol от Август 28, 2009, 14:51
Создавать две функции с одним и тем же именем, но разным телом нельзя.
Но можно в клиентском коде, где собираешься использовать read переопределить ее имя с помощью препроцессора на свое.
#define read myread.
А в реализации myread с чистой совестью вызывать стандартный read.


Название: Re: Подстновка функции в саму себя
Отправлено: Igors от Август 28, 2009, 20:30
т.е. чтобы не реализовывать новую функцию №2 с другим именем, могу ли я реализации №1 и №2 написать с одним именем?
и что нужно, чтобы сработала подстановка?

примерчик пожалуйста :)
Можете.

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

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