Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
#1

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

21.06.2010, 13:10. Просмотров 977. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2010, 13:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Статическая библиотека и ссылки на процедуры (C++):

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

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

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

Статическая библиотека MVS errorLNK1120 - C++
Нужно создать статическую библиотеку в MVS. появляется ошибка, для наглядности привожу простой пример. Создаю решение Х, тип приложения...

Статическая или динамическая библиотека - C++
Хочу создать свои функции? Какие библиотеки лучше использовать?

Статическая библиотека, error C1083 - C++
Создал библиотеку, скомпилировал. Создал второй проект, ссылающийся на библиотеку, при компиляции выдаёт ошибку: error C1083: Не...

9
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
21.06.2010, 13:38 #2
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
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
21.06.2010, 13:58  [ТС] #3
благодарю за помощь
Цитата Сообщение от 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
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
21.06.2010, 14:15 #4
метод, совпадающий с именем класса будет являться конструктором. разве описываемая процедура имеет к этому отношение?
я это к тому, что когданибудь инициализировать указатель надо будет, например в конструкторе
Цитата Сообщение от SentineL-88 Посмотреть сообщение
"void (__cdecl *)(int &)" в "void (__cdecl *)(int &,int &)""
Цитата Сообщение от SentineL-88 Посмотреть сообщение
void (*Gen)(int &);
у вас разные описания, видать Gen - (*Gen*)(int&,int&) - от двух параметров описан
1
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
21.06.2010, 14:40  [ТС] #5
да, точно =) мог бы и сам разобраться. ещё раз спасибо.
PS я так понимаю, в MyProg.cpp использовать имя "_Ger" (при такой инициализации) для описания процедуры?
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
21.06.2010, 14:47 #6
а я кажется понял что вы хотите, вы хотите из main передать функцию в lib, обычно бывает наоборот)

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

Добавлено через 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
37 / 37 / 3
Регистрация: 28.07.2009
Сообщений: 144
22.06.2010, 03:39 #8
SentineL-88, расставь точки останова, или вообще пошагово иди. У тебя код небольшой, вполне реально.
1
ISergey
Maniac
Эксперт С++
1390 / 901 / 55
Регистрация: 02.01.2009
Сообщений: 2,693
Записей в блоге: 1
22.06.2010, 04:06 #9
Как на счет 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
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
22.06.2010, 10:52  [ТС] #10
JamesBlack, хоть это и не весь код, но даже целиком он, действительно, не так уж и велик. расставил точек и нашёл логическую ошибку. вообще не понятно как он раньше работал.
ISergey, благодарю за совет, но у меня вполне чёткое задание.
всем ещё раз спасибо за помощь
0
22.06.2010, 10:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2010, 10:52
Привет! Вот еще темы с ответами:

Статическая библиотека к имеющейся программе - C++
Ребят. Есть лаба (архив прложен к сообщению) Нужно сделать эту же лабу, только чтобы модули находились в статической библиотеке. Как я...

Зачем нужны rvalue ссылки, если есть универсальные ссылки - C++
Читаю книгу Скотта Мэйерса... Что-то я совсем запутался с этими rvalue ссылками. Я не пойму, зачем нужны rvalue ссылки, если есть...

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru