pointer to function in constructor

M

Mad Ant

Hello all.

I have to convert a program from C to C++. The original code used
drivers that were available in C, and now are only available in C++.
Thus, I have the "honour" of converting the code.
There are a couple of areas that are blocking me. I've already taken
care of the rest.

I have a structure that is initialized as soon as it is declared in a
variable :
<<
const struct driver_t beirlistener_driver = {
.name = "beirlistener_driver",
.cfg_ctl = {
.cfg_new = &beirlistener_cfg_new,
.cfg_parse = &beirlistener_cfg_parse,
.cfg_del = &beirlistener_cfg_del,
.cfg_parse_ended = &beirlistener_cfg_parse_end
},
.ctx_ctl = {
.ctx_new = &beirlistener_ctx_new,
.ctx_del = &beirlistener_ctx_del
},
.thread_ctl = {
.run = &beirlistener_run,
.queue_clean = NULL,
.stop = &thread_request_stop_intr
}
};name is, of course, a 'char *'.
cfg_ctl, ctx_ctl and thread_ctl are structures containing pointers to
functions.
The structure contains the necessary functions called to initialize,
un, and destroy/delete a thread. It is used in several different
files, depending on the thread it has to start.

Of course, it would be folly to suppose that it would be accepted as
is in C++. It's not.
The only real solution I could find was to declare a constructor for
the struct (not really elegant, I know), which would receive the
addresses of the functions that are called. So the variable
declaration would be something along the lines of :
<<
const struct driver_t beirlistener_driver = {"beirlistener_driver",
&beirlistener_cfg_new, &beirlistener_cfg_parse, ...};However, I tried declaring it as such ... :
<<
struct driver_t {
char * name;
struct config_ctl_t cfg_ctl;
struct context_ctl_t ctx_ctl;
struct thread_ctl_t thread_ctl;

driver_t(char * cname, int (*fcn)(void **)) {
name = cname;
cfg_ctl.cfg_new = fcn;
}
};... along with the variable declaration as mentioned just above, but
it doesn't work. It doesn't seem to recognize the pointer to a
function in the constructor, since it gives me the following message :
<<
/home/anton/Projects/splusserver3/src/beirlistener.c:90: error: scalar
object ‘beirlistener_driver’ requires one element in initializer
I've done research, but I con't find a solution to this.
Any help anyone can give me to resolve this is very much appreciated.
Thanks all.

Anton
 
M

mlimber

I have to convert a program from C to C++. The original code used
drivers that were available in C, and now are only available in C++.
Thus, I have the "honour" of converting the code.
There are a couple of areas that are blocking me. I've already taken
care of the rest.

I have a structure that is initialized as soon as it is declared in a
variable :
<<
const struct driver_t beirlistener_driver = {
        .name = "beirlistener_driver",
        .cfg_ctl = {
                .cfg_new = &beirlistener_cfg_new,
                .cfg_parse = &beirlistener_cfg_parse,
                .cfg_del = &beirlistener_cfg_del,
                .cfg_parse_ended = &beirlistener_cfg_parse_end
        },
        .ctx_ctl = {
                .ctx_new = &beirlistener_ctx_new,
                .ctx_del = &beirlistener_ctx_del
        },
        .thread_ctl = {
                .run = &beirlistener_run,
                .queue_clean = NULL,
                .stop = &thread_request_stop_intr
        }};

name is, of course, a 'char *'.
cfg_ctl, ctx_ctl and thread_ctl are structures containing pointers to
functions.
The structure contains the necessary functions called to initialize,
un, and destroy/delete a thread. It is used in several different
files, depending on the thread it has to start.

Of course, it would be folly to suppose that it would be accepted as
is in C++. It's not.
The only real solution I could find was to declare a constructor for
the struct (not really elegant, I know), which would receive the
addresses of the functions that are called. So the variable
declaration would be something along the lines of :
<<
const struct driver_t beirlistener_driver = {"beirlistener_driver",
&beirlistener_cfg_new, &beirlistener_cfg_parse, ...};

However, I tried declaring it as such ... :
<<
struct driver_t {
        char                    *       name;
        struct config_ctl_t             cfg_ctl;
        struct context_ctl_t            ctx_ctl;
        struct thread_ctl_t             thread_ctl;

        driver_t(char * cname, int (*fcn)(void **)) {
                name = cname;
                cfg_ctl.cfg_new = fcn;
        }};

... along with the variable declaration as mentioned just above, but
it doesn't work. It doesn't seem to recognize the pointer to a
function in the constructor, since it gives me the following message :
<<
/home/anton/Projects/splusserver3/src/beirlistener.c:90: error: scalar
object ‘beirlistener_driver’ requires one element in initializer



I've done research, but I con't find a solution to this.
Any help anyone can give me to resolve this is very much appreciated.
Thanks all.

Try:

const struct driver_t beirlistener_driver = {
"beirlistener_driver",
{
&beirlistener_cfg_new,
&beirlistener_cfg_parse,
&beirlistener_cfg_del,
&beirlistener_cfg_parse_end
},
{
&beirlistener_ctx_new,
&beirlistener_ctx_del
},
{
&beirlistener_run,
NULL,
&thread_request_stop_intr
}
};

Cheers! --M
 
M

Mad Ant

Try:

const struct driver_t beirlistener_driver = {
"beirlistener_driver",
{
&beirlistener_cfg_new,
&beirlistener_cfg_parse,
&beirlistener_cfg_del,
&beirlistener_cfg_parse_end
},
{
&beirlistener_ctx_new,
&beirlistener_ctx_del
},
{
&beirlistener_run,
NULL,
&thread_request_stop_intr
}
};

Cheers! --M

This works perfectly. I can't believe I didn't think of it. *hits
himself on the forehead*

Cheers!

Mad Ant
 
O

Old Wolf

Hello all.

I have to convert a program from C to C++. The original code used
drivers that were available in C, and now are only available in C++.
Thus, I have the "honour" of converting the code.

Are you aware that you can mix C and C++
within a project ? If you have working C
code, then you do not need to change it;
you can add C++ files to the project and
still link the objects together.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,821
Latest member
AleidaSchi

Latest Threads

Top