quick questions

S

Steve Chow

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?
 
J

Jens Theisen

Steve Chow said:
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
 
S

Stuart Redmann

Steve said:
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
 
F

Frederick Gotham

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");
}
 

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,764
Messages
2,569,567
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top