Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   quick questions (http://www.velocityreviews.com/forums/t456792-quick-questions.html)

Steve Chow 09-11-2006 06:19 AM

quick questions
 
i haven't seen these in any tutorials or anything i've read so i'm
wondering if someone could tell me what they're called so i can
research them.

i've only seen functions like

animal.make_noise("fart");

but the other day i ran into something like

animal.sounds().make_noise("fart");

is there a name for calling multiple functions like this?


Jens Theisen 09-11-2006 07:42 AM

Re: quick questions
 
"Steve Chow" <msweaksauce@hotmail.com> writes:

> animal.sounds().make_noise("fart");
>
> is there a name for calling multiple functions like this?


No, but there is also nothing special about it.

animial has a member function sounds, which returns some object x
which has in turn a member function make_noise taking a string.

The above line could happily be java with the same semantics.

Cheers,

Jens

Stuart Redmann 09-11-2006 08:26 AM

Re: quick questions
 
Steve Chow wrote:

> i haven't seen these in any tutorials or anything i've read so i'm
> wondering if someone could tell me what they're called so i can
> research them.
>
> i've only seen functions like
>
> animal.make_noise("fart");
>
> but the other day i ran into something like
>
> animal.sounds().make_noise("fart");
>
> is there a name for calling multiple functions like this?
>


It's not that two methods sounds () and make_noise (...) are called for
the animal object, but rather only sounds (). This method would return
another object that we don't know (at least I guess this, else the code
wouldn't compile or make sense). For this object the method
make_noise(...) is called.

As far as I know there is no special name for such a mechanism. If
sounds () were a method that returned the animal object, this would be
called 'call chaining'. This is used for reading and writing formatted
data with IO streams. Consider for example operator<< for streams. Using
this you can write statements like
cout << "Some text" << iSomeNumber << "AnotherText";
This statement could be written as
cout << "Some text";
cout << iSomeNumber;
cout << "AnotherText";
Since it would be tedious to repeat 'cout << ' over and over again, the
operator<< for streams should output the argument and return the stream.

Regards,
Stuart

Gernot Frisch 09-11-2006 10:31 AM

Re: quick questions
 

> animal.sounds().make_noise("fart");
> is there a name for calling multiple functions like this?


explicit lyrics?



Frederick Gotham 09-11-2006 02:24 PM

Re: quick questions
 
Steve Chow posted:

> animal.sounds().make_noise("fart");



This is equivalent to:

( animal.sounds() ).make_noise("fart");


As you can see, the "sounds" member function is invoked first, yielding an
expression. The "make_noise" member function is then invoked upon this
expression. An example would be:

class SoundSystem {
public:

void make_noise(char const *) const {}
};

class Animal {
private:

SoundSystem sndsys;

public:

SoundSystem &sounds()
{
return sndsys;
}
};

int main()
{
Animal animal;

animal.sounds().make_noise("fart");
}

--

Frederick Gotham

tragomaskhalos 09-11-2006 03:03 PM

Re: quick questions
 

Steve Chow wrote:
>
> animal.make_noise("fart");
>
> but the other day i ran into something like
>
> animal.sounds().make_noise("fart");
>


Note that there is a school of thought that says that the second form
is A Bad Thing: see http://en.wikipedia.org/wiki/Law_Of_Demeter or
http://www.c2.com/cgi/wiki?LawOfDemeter



All times are GMT. The time now is 10:44 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.