Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Non-initialized class

0 views
Skip to first unread message

ejstans

unread,
Oct 28, 2008, 3:53:29 PM10/28/08
to
Hello,

I encountered something unfamiliar to me today and I would like some
clarifications. Unfortunately I don't have access to a standard but
even if I did, I'm not even sure if I could understand it well enough
to answer my question...

Here's the deal: without instantiating the class, the code in question
calls both static and non-static member functions like this:

class foo {
public:
static void bar() { std::cout << "bar" << std::endl; }
void bar2() { std::cout << "bar2" << std::endl; }
};

void
func(foo* f)
{
f->bar();
f->bar2();
}

int
main()
{
func(NULL);
return 0;
}

Is this allowed? And if it is, does a situation exist where it would
be an advisable way of doing things?

Pete Becker

unread,
Oct 28, 2008, 4:05:49 PM10/28/08
to
On 2008-10-28 15:53:29 -0400, ejstans <j.l.o...@gmail.com> said:

>
> Here's the deal: without instantiating the class, the code in question
> calls both static and non-static member functions like this:

You don't have to have any instances of a class to call static member
functions. Calling non-static member functions through a null pointer
produces undefined behavior.


>
> Is this allowed? And if it is, does a situation exist where it would
> be an advisable way of doing things?

No.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Pete Becker

unread,
Oct 28, 2008, 4:13:07 PM10/28/08
to
On 2008-10-28 16:05:49 -0400, Pete Becker <pe...@versatilecoding.com> said:

> On 2008-10-28 15:53:29 -0400, ejstans <j.l.o...@gmail.com> said:
>
>>
>> Here's the deal: without instantiating the class, the code in question
>> calls both static and non-static member functions like this:
>
> You don't have to have any instances of a class to call static member
> functions. Calling non-static member functions through a null pointer
> produces undefined behavior.
>>
>> Is this allowed? And if it is, does a situation exist where it would
>> be an advisable way of doing things?
>
> No.

That is, "No" to calling non-static member functions without an object.
Static member functions are fine.

Erik Wikström

unread,
Oct 28, 2008, 4:17:30 PM10/28/08
to

No, this is not allowed. The reason it works is because you are not
trying to access any class member and the way the compiler generates to
code. It is never advisable to do something like this.

Note though that you can always access static member functions without
an object using the foo::bar() notation.

--
Erik Wikström

Victor Bazarov

unread,
Oct 28, 2008, 5:12:11 PM10/28/08
to
Erik Wikström wrote:
> On 2008-10-28 20:53, ejstans wrote:
>> Hello,
>>
>> I encountered something unfamiliar to me today and I would like some
>> clarifications. Unfortunately I don't have access to a standard but
>> even if I did, I'm not even sure if I could understand it well enough
>> to answer my question...
>>
>> Here's the deal: without instantiating the class, the code in question
>> calls both static and non-static member functions like this:
>>
>> class foo {
>> public:
>> static void bar() { std::cout << "bar" << std::endl; }
>> void bar2() { std::cout << "bar2" << std::endl; }
>> };
>>
>> void
>> func(foo* f)
>> {
>> f->bar();
>> f->bar2();
>> }
>>
>> int
>> main()
>> {
>> func(NULL);
>> return 0;
>> }
>>
>> Is this allowed? And if it is, does a situation exist where it would
>> be an advisable way of doing things?
>
> No, this is not allowed. The reason it works is [..]

<rant>
The behaviour is undefined. Any attempt to explain why undefined
behaviour actually creates an illusion (yes, an illusion) of a working
program only contributes to the confusion. Now the OP might think,
"it's OK if <blahblah>". But the actual mantra should be "no, it's not
OK, ever". It's similar to "When/Why is it OK to point an unloaded
weapon at your friend's head?" Well, it's NOT. Ever. So, the premise
here ("it works") is wrong. It does NOT work. It's not defined to.
</rant>

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask

Erik Wikström

unread,
Oct 28, 2008, 5:17:36 PM10/28/08
to
On 2008-10-28 21:13, Pete Becker wrote:
> On 2008-10-28 16:05:49 -0400, Pete Becker <pe...@versatilecoding.com> said:
>
>> On 2008-10-28 15:53:29 -0400, ejstans <j.l.o...@gmail.com> said:
>>
>>>
>>> Here's the deal: without instantiating the class, the code in question
>>> calls both static and non-static member functions like this:
>>
>> You don't have to have any instances of a class to call static member
>> functions. Calling non-static member functions through a null pointer
>> produces undefined behavior.
>>>
>>> Is this allowed? And if it is, does a situation exist where it would
>>> be an advisable way of doing things?
>>
>> No.
>
> That is, "No" to calling non-static member functions without an object.
> Static member functions are fine.

But you would have to use the Class::Function() notation right? I assume
that that 9.4/2 applies to static member functions as well, more
specifically: "A static member may be referred to using the class member
access syntax, in which case the object-expression is evaluated."

--
Erik Wikström

ejstans

unread,
Oct 28, 2008, 5:18:38 PM10/28/08
to

Thanks for the quick replies (that goes to everyone of course).

I've got the gist of the matter, but just to cross all the i's and dot
all the t's, is it in fact valid according to the standard to call a
static member function through a NULL pointer? But invalid (undefined
result?) to do so with a non-static function, even if it doesn't touch
any member data? This is just to satisfy my curiousity, I don't like
this construction and don't plan on using it myself...

ejstans

unread,
Oct 28, 2008, 5:23:43 PM10/28/08
to

Heh! Thanks! I was after this kind of clear-cut answer; that's why I
persisted with the second question as to the actual "legality" of it,
unfortunately posted before I could see your reply.

Pete Becker

unread,
Oct 28, 2008, 6:19:30 PM10/28/08
to

Yes, I think you're right. I wasn't referring to obj->f() (where f is a
static member function), but to C::f() even when no object of type C
exists. That's not what the code in the original question did, so I may
have confused folks.

Michael

unread,
Oct 29, 2008, 12:53:53 AM10/29/08
to
In this case, you are trying to dereference a NULL pointer, which will
produce undefined behaviour.

Old Wolf

unread,
Oct 29, 2008, 6:47:14 PM10/29/08
to
On Oct 29, 10:18 am, ejstans <j.l.ols...@gmail.com> wrote:
> I've got the gist of the matter, but just to cross all the i's and dot
> all the t's, is it in fact valid according to the standard to call a
> static member function through a NULL pointer?

No.


0 new messages