istream in init list

T

Thomas Matthews

Hi,

In some threads, some people mentioned that variable initialization is
best performed in an initialization list.

Is there a way to initialize a variable from an istream in an
initialization list?
Example:
class My_Class
{
public:
My_Class(istream& inp);
private:
unsigned int value;
};

My_Class :: My_Class(istream& inp)
/* [1] */ : value(/* ??? */)
{ ; }
I looked at the istream class and there is no method for
inputting an integer. The extraction operator is defined as a
non-member function.

So, if it is possible to initialize from an istream in the
initialization list, what is replaces "/* ??? */" in [1] above?

--
Thomas Matthews

C++ newsgroup welcome message:
http://www.slack.net/~shiva/welcome.txt
C++ Faq: http://www.parashift.com/c++-faq-lite
C Faq: http://www.eskimo.com/~scs/c-faq/top.html
alt.comp.lang.learn.c-c++ faq:
http://www.raos.demon.uk/acllc-c++/faq.html
Other sites:
http://www.josuttis.com -- C++ STL Library book
http://www.sgi.com/tech/stl -- Standard Template Library
 
?

=?iso-8859-1?Q?Juli=E1n?= Albo

Thomas Matthews escribió:
Is there a way to initialize a variable from an istream in an
initialization list?
Example:
class My_Class
{
public:
My_Class(istream& inp);
private:
unsigned int value;
};

My_Class :: My_Class(istream& inp)
/* [1] */ : value(/* ??? */)
{ ; }
I looked at the istream class and there is no method for
inputting an integer. The extraction operator is defined as a
non-member function.

So, if it is possible to initialize from an istream in the
initialization list, what is replaces "/* ??? */" in [1] above?

The simplest way is define a constructor for the class of "value" that
takes an & istream as parameter and simply doing:
value (inp)

If not desired, simply write a function that takes & istream as
parameter and return a value and do:
value (myfunction (inp) )

myfunction can be an static member of My_Class, if needed or desired.

In your concrete case, where value is an unsigned int and not a member
of a class, only the second option is possible.

Regards.
 
K

Kevin Goodsell

Thomas said:
Hi,

In some threads, some people mentioned that variable initialization is
best performed in an initialization list.

Is there a way to initialize a variable from an istream in an
initialization list?
Example:
class My_Class
{
public:
My_Class(istream& inp);
private:
unsigned int value;
};

My_Class :: My_Class(istream& inp)
/* [1] */ : value(/* ??? */)
{ ; }
I looked at the istream class and there is no method for
inputting an integer. The extraction operator is defined as a
non-member function.

So, if it is possible to initialize from an istream in the
initialization list, what is replaces "/* ??? */" in [1] above?

int ReadInt(istream &is)
{
int i;
is >> i;
return i;
}

My_Class::My_Class(istream &inp) : value(ReadInt(inp)) {}

Short of something like this, I don't see a way. This is of questionable
value also, because there's no error checking. You could put error
checking in ReadInt(), but the only thing it could really do to signal
the error is throw an exception.

-Kevin
 
T

Thomas Matthews

Kevin said:
Thomas said:
Hi,

In some threads, some people mentioned that variable initialization is
best performed in an initialization list.

Is there a way to initialize a variable from an istream in an
initialization list?
Example:
class My_Class
{
public:
My_Class(istream& inp);
private:
unsigned int value;
};

My_Class :: My_Class(istream& inp)
/* [1] */ : value(/* ??? */)
{ ; }
I looked at the istream class and there is no method for
inputting an integer. The extraction operator is defined as a
non-member function.

So, if it is possible to initialize from an istream in the
initialization list, what is replaces "/* ??? */" in [1] above?

int ReadInt(istream &is)
{
int i;
is >> i;
return i;
}

My_Class::My_Class(istream &inp) : value(ReadInt(inp)) {}

Short of something like this, I don't see a way. This is of questionable
value also, because there's no error checking. You could put error
checking in ReadInt(), but the only thing it could really do to signal
the error is throw an exception.

-Kevin

Your suggestion appears to be less efficient than reading in the
value in the constructor:
/* [2] */
My_Class :: My_Class(istream& inp)
{
inp >> value;
}

IMHO, this is a case where assignment in the body of a constructor
is more efficient than in the initializer list.

--
Thomas Matthews

C++ newsgroup welcome message:
http://www.slack.net/~shiva/welcome.txt
C++ Faq: http://www.parashift.com/c++-faq-lite
C Faq: http://www.eskimo.com/~scs/c-faq/top.html
alt.comp.lang.learn.c-c++ faq:
http://www.raos.demon.uk/acllc-c++/faq.html
Other sites:
http://www.josuttis.com -- C++ STL Library book
http://www.sgi.com/tech/stl -- Standard Template Library
 
K

Kevin Goodsell

Thomas said:
Kevin said:
int ReadInt(istream &is)
{
int i;
is >> i;
return i;
}

My_Class::My_Class(istream &inp) : value(ReadInt(inp)) {}

Short of something like this, I don't see a way. This is of
questionable value also, because there's no error checking. You could
put error checking in ReadInt(), but the only thing it could really do
to signal the error is throw an exception.

-Kevin


Your suggestion appears to be less efficient than reading in the
value in the constructor:
/* [2] */
My_Class :: My_Class(istream& inp)
{
inp >> value;
}

IMHO, this is a case where assignment in the body of a constructor
is more efficient than in the initializer list.

I imagine the compiler could generate the same code for both (assuming
it has access to the definition of ReadInt in order to inline it). But
generally it would probably be (slightly) less efficient. Anyway, I
don't think I'd use the separate function method unless there was a very
good reason to want to use the initializer list (e.g., if 'value' were
const).

-Kevin
 

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,982
Messages
2,570,190
Members
46,736
Latest member
zacharyharris

Latest Threads

Top