Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


c++ syntax challenge!


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
9 replies to this topic

#1 Slig Commando   Members   -  Reputation: 334

Like
0Likes
Like

Posted 30 April 2012 - 04:09 PM

I can't figure out the syntax on this one, and I need your help!

So heres the situation.

I have a member function pointer
void (EventListener::*_TriggerFunction)(EVENT evnt, int senderID)

Nothing fancy.

The problem is, normally you would simply call it like so
this->*_TriggerFunction(....)

but this does not work in a static member function. You get a "non-static member reference" error.

static void Blah(void* obj)
{
EventListener* listener = static_cast<EventListener*>(obj)

listener->*_TriggerFunction(.....);  //Produces error.
}

One solution is to make another member function that is non static, that you call, which inturn calls _TriggerFunction,
but that seems messy and not correct.

Sorry I am not on my regular computer, otherwise I would post some actual code, but I hope this explains my situation!

Thanks!

Sponsor:

#2 SimonForsman   Crossbones+   -  Reputation: 6294

Like
-1Likes
Like

Posted 30 April 2012 - 04:21 PM

Adding a non static method might be the easiest solution, I can't think of any "proper" way to do it (Allthough i tend to avoid static methods in general).

Edited by SimonForsman, 30 April 2012 - 04:28 PM.

I don't suffer from insanity, I'm enjoying every minute of it.
The voices in my head may not be real, but they have some good ideas!

#3 bradbobak   Members   -  Reputation: 1148

Like
0Likes
Like

Posted 30 April 2012 - 04:22 PM

I tihnk that because it is a static member function, its treated like a standalone function so you just use a standard non-member function pointer.


struct x
{
 void (*func)();

 static void my_func() { }
};

int main()
{
 x xx;

 xx.func = x::my_func;

  xx.func();
}


#4 Washu   Senior Moderators   -  Reputation: 5417

Like
0Likes
Like

Posted 30 April 2012 - 04:37 PM

What you do is use boost::function or std::function (if C++11 is available). You can also use any of the other various libraries that provide function/functor wrappers.

In time the project grows, the ignorance of its devs it shows, with many a convoluted function, it plunges into deep compunction, the price of failure is high, Washu's mirth is nigh.
ScapeCode - Blog | SlimDX


#5 Mihai Moldovan   Members   -  Reputation: 127

Like
0Likes
Like

Posted 30 April 2012 - 05:19 PM

Can't believe no one pointed this out, this is such an amateur mistake.

Simply change
listener->*_TriggerFunction(.....);  // Produces error
to
(listener->*_TriggerFunction)(.....);  // Won't produce any error <img src='http://public.gamedev.net//public/style_emoticons/<#EMO_DIR#>/smile.png' class='bbc_emoticon' alt=':)' />

Edited by Mihai Moldovan, 30 April 2012 - 05:20 PM.


#6 Slig Commando   Members   -  Reputation: 334

Like
0Likes
Like

Posted 30 April 2012 - 09:38 PM

(listener->*_TriggerFunction)(.....); // Won't produce any error :)


I tried that, but it does not fix any thing =(

I tihnk that because it is a static member function, its treated like a standalone function so you just use a standard non-member function pointer.

It is a private function pointer that points to a protected member function for inheritance reasons.

What you do is use boost::function or std::function (if C++11 is available). You can also use any of the other various libraries that provide function/functor wrappers.


That may solve the problem, but all boost is, is a helper library, its not doing anything magical that you cannot do with native c++

#7 Cornstalks   Crossbones+   -  Reputation: 6991

Like
0Likes
Like

Posted 30 April 2012 - 10:03 PM


I tihnk that because it is a static member function, its treated like a standalone function so you just use a standard non-member function pointer.

It is a private function pointer that points to a protected member function for inheritance reasons.

I'm not sure you understood what bradbobak was getting at (read the note at the bottom of 33.1)
[ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]

#8 Slig Commando   Members   -  Reputation: 334

Like
0Likes
Like

Posted 30 April 2012 - 10:35 PM

Im sorry, I was not very clear =(. The function pointer points to a non-static member function, and I am trying to call that non-static member function(via pointer) in a member static function.

Anyways, the reason I was attempting to do it in a static function was because it was a thread entry function, but I can just change the thread entry function to call a non-static function and loop in there(instead of the static thread entry).

Thanks for taking the time to respond!

Edited by Slig Commando, 30 April 2012 - 10:37 PM.


#9 Cornstalks   Crossbones+   -  Reputation: 6991

Like
0Likes
Like

Posted 30 April 2012 - 10:53 PM

Im sorry, I was not very clear =(. The function pointer points to a non-static member function, and I am trying to call that non-static member function(via pointer) in a member static function.

Ah, I see. Sorry I misunderstood you.

Just a slight pointer on style: don't use identifiers that either start with an underscore followed by an upper case letter or start with two underscores. Identifiers like these are reserved for the compiler, and you're just asking for headaches in the future if you ignore this.
[ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]

#10 Álvaro   Crossbones+   -  Reputation: 13897

Like
0Likes
Like

Posted 30 April 2012 - 10:56 PM

Mihai Moldovan told you what the problem was a few posts ago.

#include <iostream>

typedef int EVENT;

struct EventListener {
  void f(EVENT, int) { std::cout << "f\n";}
  void g(EVENT, int) { std::cout << "g\n";}
};

void (EventListener::*_TriggerFunction)(EVENT evnt, int senderID);

static void Blah(void* obj) {
  EventListener* listener = static_cast<EventListener*>(obj);

  (listener->*_TriggerFunction)(0,0);  // Seems to work
}

int main() {
  EventListener el;
  _TriggerFunction = &EventListener::f;
  Blah(static_cast<void *>(&el));
}






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS