Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23

Статическая библиотека и ссылки на процедуры

21.06.2010, 13:10. Показов 2943. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток. Столкнулся с проблемой: необходимо из метода класса в статической библиотеке обратиться к процедуре, описанной вне библиотеки.
не могу понять как правильно инициализировать ссылку на процедуру в класса, как обращаться к ней из метода и как работать с ней в программе.
MyLib.h:
C++
1
2
3
4
5
6
7
8
9
10
namespace mine
{
    class generator
    {
        int m;  
        void (*Gen)(int &);
    public:
    void new_obj ();
    };
}
MyLib.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
#include "MyLib.h"
#include <stdexcept>
using namespace std;
namespace mine
{
    void generator::new_obj ()
    {
        m++;
        Gen (m);
    };
}
ну и, собственно, MyProg.cpp:
C++
1
2
3
4
5
6
7
8
9
10
void (*Gen) (int & N)
{
    cout <<N;
    return;
}
int main ()
{
    (*Gen) (N);
    return;
}
Добавлено через 1 час 5 минут
т.е.
1) так ли описывать ссылку в классе?
2) так ли обращаться к функции из метода класса?
3) так ли использовать её в программе?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.06.2010, 13:10
Ответы с готовыми решениями:

Статическая библиотека
Имеется статическая библиотека, которая подключается к основной программе. Необходимо максимально скрыть всё с библиотеки, а именно: скрыть...

Статическая библиотека
Добрый день. Подскажите, плз, описание статической библиотеки ее структуры. и утилиту которой можно проконтролировать...

Статическая библиотека
lib main.h namespace x { int __stdcall WindowCreate( ... ); } main.cpp

9
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
21.06.2010, 13:38
1) так ли описывать ссылку в классе?
вы описываете не ссылку, а указатель на функцию, ну так правильно
Но где ее инициализация? дб нечто вроде

C++
1
2
3
4
5
6
7
8
class generator
{
        int m;  
        void (*Gen)(int &);
public:
    generator( void (*_Gen)(int &) ) : Gen(_Gen) {}
    void new_obj ();
};
Вообще правда мне кажется без особой надобности не стоит пользоваться таким связывание, по мне уж лучше
extern void libfunc( int & );
и уже ей пользоваться, либо просто хедер подключить библиотеки
1
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
21.06.2010, 13:58  [ТС]
благодарю за помощь
Цитата Сообщение от alex_x_x Посмотреть сообщение
generator( void (*_Gen)(int &) ) : Gen(_Gen) {}
метод, совпадающий с именем класса будет являться конструктором. разве описываемая процедура имеет к этому отношение? и ещё: компилятор (VC2010) указывает на ошибку на месте "generator( void (*_Gen)(int &) ) : Gen(_Gen) {}":
"инициализация: невозможно преобразовать "void (__cdecl *)(int &)" в "void (__cdecl *)(int &,int &)""
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
21.06.2010, 14:15
метод, совпадающий с именем класса будет являться конструктором. разве описываемая процедура имеет к этому отношение?
я это к тому, что когданибудь инициализировать указатель надо будет, например в конструкторе
Цитата Сообщение от SentineL-88 Посмотреть сообщение
"void (__cdecl *)(int &)" в "void (__cdecl *)(int &,int &)""
Цитата Сообщение от SentineL-88 Посмотреть сообщение
void (*Gen)(int &);
у вас разные описания, видать Gen - (*Gen*)(int&,int&) - от двух параметров описан
1
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
21.06.2010, 14:40  [ТС]
да, точно =) мог бы и сам разобраться. ещё раз спасибо.
PS я так понимаю, в MyProg.cpp использовать имя "_Ger" (при такой инициализации) для описания процедуры?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
21.06.2010, 14:47
а я кажется понял что вы хотите, вы хотите из main передать функцию в lib, обычно бывает наоборот)

Цитата Сообщение от SentineL-88 Посмотреть сообщение
void fGen(int & N)
{
cout <<N;
return;
}
int main ()
{
generator gen;
gen.Gen = fGen;
gen.new_obj();
return;
}
_Gen переменная параметр конструктора всего для инициализации
1
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
22.06.2010, 03:04  [ТС]
вот-вот. именно это и хотелось. ещё раз спасибо

Добавлено через 11 часов 37 минут
почему-то после ввода этих указателей программа перестала правильно считать то, что она, собственно, должно считать (без них всё работает прекрасно) В чём может быть ошибка?
на всякий случай:
код

MyLib.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class System                //класс системы в целом
{
    int t;                  //интервал моделирования
    long time;              //текущее время
    int m;                  //количество объектов
    void (*Sys)(int &, int &, double &, int &, int &, int &, int &);    //процедура, вызываемая при завершении интервала моделирования
public:
    System (int T, int M, void (*_Sys)(int &, int &, double &, int &, int &, int &, int &) );       //конструктор
    void newobj (generator *gobj);                              //добавление объекта в систему
    void delobj (int num, generator &g);                        //удаление объекта из системы
    void modelling (queue &, generator &, service_device &);    //моделирование
    int get_number ();                                          //возвращает количество объектов в системе
};
MyLib.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
System::System (int T, int M, void (*_Sys)(int &, int &, double &, int &, int &, int &, int &)) 
    {
        Sys=_Sys;
        t=T; 
        m=M; 
        time=m*60;
    }
    void System::newobj (generator *gobj) {gobj->new_obj ();}       //добавление объекта в систему
    void System::delobj (int num, generator &g) {}                  //удаление объекта из системы
    int System::get_number () {return m;}
void System::modelling (queue & q, generator & g, service_device & sd)
    {/*тут длинный код моделирования, по сути, не очень нужный сейчас, и в конце:*/
        int getN=sd.getN(); 
        int result=sd.result(); 
        double mid_time=sd.mid_time(); 
        int get_n=get_number(); 
        int get_minT=q.get_minT(); 
        int get_midT=q.get_midT(); 
        int get_maxT=q.get_maxT();
        Sys (getN, result, mid_time, get_n, get_maxT, get_midT, get_minT);
    }
MyProg.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void sys_proc (int &gN, int &res, double &mt, int &n, int &maxT, int &midT, int &minT)
{
    cout <<"Excavators: "<<gN<<"\nloaded: "<<res<<"\nmid loading time: "<<mt<<"\ntrucks: "<<n<<"\nmax waiting time: "<<maxT<<"\nmid waiting time: "<<midT<<"\nmin waiting time: "<<minT;
    return;
}
int main()
{
    srand (time(0));
    int m=8;                //количество машин
    int n=2;            //количество эксковаторов
    int t=8;            //интервал моделирования
    for (m=3; m<15; m++)
    {
        queue q(m);
        generator g (m, gen_proc);
        System s (t, m, sys_proc);
        service_device sd(n, ser_proc);
        s.modelling (q, g, sd);
        cout <<"\n\n";
    }
    getch();
    return 0;
}

программа перестаёт считать весь тот список переменных и вообще ведёт себя крайне странно: ставил "cout<<1;" везде где ни попадя (по-деревенски, но что поделать...), вообще представления не имею по какому принципу совершаются обходы циклов после введения указателей на процедуры.
0
 Аватар для JamesBlack
46 / 46 / 5
Регистрация: 28.07.2009
Сообщений: 144
22.06.2010, 03:39
SentineL-88, расставь точки останова, или вообще пошагово иди. У тебя код небольшой, вполне реально.
1
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
22.06.2010, 04:06
Как на счет std::function в С++0х или boost::function
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <functional>
 
void func1 () {  std::cout << "func_1\n"; }
void func2 () {  std::cout << "func_2\n"; }
void func3 () {  std::cout << "func_3\n"; }
 
int main()
{
    std::function<void ()> f;
 
    f = &func1;
    f();
 
    f = &func2;
    f();
 
    f = &func3;
    f();
 
    return 0;
}
Как на меня это проще...
2
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
22.06.2010, 10:52  [ТС]
JamesBlack, хоть это и не весь код, но даже целиком он, действительно, не так уж и велик. расставил точек и нашёл логическую ошибку. вообще не понятно как он раньше работал.
ISergey, благодарю за совет, но у меня вполне чёткое задание.
всем ещё раз спасибо за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.06.2010, 10:52
Помогаю со студенческими работами здесь

Статическая библиотека на Fortran
Есть код на фортране. Мне нужно собрать его в статическую библиотеку lib. Далее эта библиотека должна использоваться в проекте на С++. Все...

Статическая библиотека в QT5
Будучи новичком в QT, прошу помощи у уважаемого сообщества, в вопросе создания статической библиотеки на QT. Просмотрев несколько, на мой...

Ошибки,статическая библиотека
Не понимаю,что не нравится компилятору. Пишет,что для &quot;{&quot; требуется объявление.. И если кто-то разбирается в создании статических...

Статическая библиотека VS2017
Здравствуйте, Подскажите пожалуйста, можно ли, и если можно то как в VS2017 собрать статическую lib библиотеку следующим образом: ...

Расширение файла (.a). Статическая библиотека
Здравия, пингвины! :p Я пришел из мира Windows, где статические библиотеки имеют расширение .lib (library). Недавно узнал, что в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru