Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объявление типов функций 
V
    Опции темы
knek
Дата 4.7.2007, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 23.3.2007

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



Привет всем! У мну возник вопрос связанный с обьявлением функций как типов в С++.

Код

#include <iostream.h> 

class A
{
public:
        void SomeFunc(){ cout << "Hello, world!"; };
};

typedef void(__closure *Func)();

int main()
{
        A x;  
        Func f; //объявляем функцию f типа Func, т.е. void f();
        f=x.SomeFunc; //приравниваем к адресу др функции из класса
        f(); //запускаем функцию (из класса)

        int qwe; //эт что б консоль не закрылась:)
        cin >> qwe;
};


Так вот в чем вопрос: можно ли приравнять f к функции не из класса? Я пробывал - пишет что нельзя конвертировать типы. Может надо как то по другому определить тип Func?

Я приведу пример на дельфи:
Код

program Project1;

{$APPTYPE CONSOLE}

type
  TFunc = procedure; //объявляем процедуру как тип...

procedure Some;
begin
  writeln('Hello world!');
  readln;
end;

var
  f: TFunc = Some; //...и используем, причем приравниваем к процедуре не из класса
//прчем тип TFunc можно использовать и внутри классов итп
//есть ещё приколы типа procedure of object но это уже не сюда, вопрос поставлен...

begin
  f;
end.

PM MAIL   Вверх
archimed7592
Дата 4.7.2007, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Убери __closure и сможешь приравнивать к ней указатели на ф-ции НЕчлены, но не сможешь указатели на ф-ции члены.

В Delphi вместо closure используется слово object, если память не изменяет.

К слову, closure - исключительно borland-расширение


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 4.7.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(knek @  4.7.2007,  18:05 Найти цитируемый пост)
__closure

борландовская фигня. К стандарту С++ отношения не имеет.

Цитата(knek @  4.7.2007,  18:05 Найти цитируемый пост)
Так вот в чем вопрос: можно ли приравнять f к функции не из класса?

в общем случае - нет.


Это сообщение отредактировал(а) JackYF - 4.7.2007, 18:11


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 4.7.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Цитата(JackYF @  4.7.2007,  18:11 Найти цитируемый пост)
в общем случае - нет.

Эээ... ты про "f" конкретно или про возможность такую в общем? smile 
Код

typedef void func_t();

void f()
{
// ...
}

int main()
{
    func_t *pFunc = &f;

    pFunc();
    (*pFunc)(); // или так...

    return 0;
}



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 4.7.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(archimed7592 @  4.7.2007,  18:15 Найти цитируемый пост)
Эээ... ты про "f" конкретно

да, немного неясно написал. да.

естественно, указатели на функции можно присваивать smile



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
knek
Дата 4.7.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 23.3.2007

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



Во!)) Я пнял теперь))
А я пытался объявлять типа
Код

typedef void() func

и в том же духе))

Просто по задумке идёт typedef <старое имя типа> <новое имя типа>
Ну я и пытался так писать. Всё! Спасибо всем! В особенности archimed7592, я бы не догадался ставить * && &
PM MAIL   Вверх
archimed7592
Дата 4.7.2007, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Цитата(knek @  4.7.2007,  18:28 Найти цитируемый пост)
Просто по задумке идёт typedef <старое имя типа> <новое имя типа>

Да незачто... вообще-то в учебниках учат писать так:
Код

void f();
// ...

typedef void (*pFunc_t)();

pFunc_t pFunc = f;
Но, в ходе чтения стандарта я нашёл для себя такой вот прекрасный способ. Во-первых, он чётче выражает то, что хотим написать (func_t *pFunc = &f; - именно указатель и именно взятие адреса ф-ции). Т.е. повышается самодокументированность кода. Во-вторых, запись 
Код

typedef void func_t()
 как не крути, проще читать, чем запись 
Код

typedef void (*func_t)();
(ощутимо для более сложных сигнатур).

Добавлено через 3 минуты и 1 секунду
Цитата(knek @  4.7.2007,  18:28 Найти цитируемый пост)
Просто по задумке идёт typedef <старое имя типа> <новое имя типа>

Долго думал, что же ты подразумеваешь под "старым" и "новым" типами smile. Понял. Нет, такая задумка работает только в тривиальных случаях.
Код

typedef int arr_3[3]; // int [3]
typedef bool (A::*mem_fun)(const A&, const A&);
// и т.п.



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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