Help converting this Write to operator<< overload

J

Jim Langston

I have a CSkill class which is rather complex as it is recursive. That is:

class CSkill
{
public:
CSkill( std::string Name, float Value ): Name_( Name ), Value_( Value )
{};
void Update( const std::string& Name, const float Value );
float Value( const std::string& Name ) const;
float Sum( const std::string& Name ) const;
void Write( std::eek:stream& os, const std::string& Prefix ) const;

std::string CSkill::plainName( const std::string& Name ) const;

friend std::istream& operator>>( std::istream& is, CSkill& Skill);

private:
float Sum() const;

std::string Name_;
float Value_;
std::map< std::string, CSkill > Skills_;

};

Well, to output this class to an ostream, I use this function:

void CSkill::Write( std::eek:stream& os, const std::string& Prefix ) const
{
if ( Name_.length() > 0 && Value_ > 0 )
os << Prefix << Name_ << " " << Value_ << std::endl;
for ( std::map< std::string, CSkill >::const_iterator it =
Skills_.begin(); it != Skills_.end(); ++it )
{
(*it).second.Write( os, ( Name_.length() > 0 ? Prefix + Name_ + "|"
: "" ) );
}
}

but I would prefer to use
std::eek:stream& operator<<( /* what goes here? */ )

The problem I see is that I need to pass that extra parameter, a
std::string, which is used in the recursion. Is something like this
allowed?
outfile << Skills( "" ) << SomethingElse

I don't think so because a "normal" declaration of the operator<< would be
something like:
std::eek:stream& operator<<( std::eek:stream& os, CCharacter& CChar)

and so I would have to make it something like:
std::eek:stream& operator<<( std::eek:stream& os, const CSkill& Skill, const
std::string& Prefix )

But the compiler complains (no suprise):
error C2804: binary 'operator <<' has too many parameters

Any suggestions or do I just have to stick with the way I'm doing it?
 
M

Marcus Kwok

Jim Langston said:
I have a CSkill class which is rather complex as it is recursive. That is:

class CSkill
{
public:
CSkill( std::string Name, float Value ): Name_( Name ), Value_( Value )
{};
void Update( const std::string& Name, const float Value );
float Value( const std::string& Name ) const;
float Sum( const std::string& Name ) const;
void Write( std::eek:stream& os, const std::string& Prefix ) const;

std::string CSkill::plainName( const std::string& Name ) const;

friend std::istream& operator>>( std::istream& is, CSkill& Skill);

private:
float Sum() const;

std::string Name_;
float Value_;
std::map< std::string, CSkill > Skills_;

};

Well, to output this class to an ostream, I use this function:

void CSkill::Write( std::eek:stream& os, const std::string& Prefix ) const
{
if ( Name_.length() > 0 && Value_ > 0 )
os << Prefix << Name_ << " " << Value_ << std::endl;
for ( std::map< std::string, CSkill >::const_iterator it =
Skills_.begin(); it != Skills_.end(); ++it )
{
(*it).second.Write( os, ( Name_.length() > 0 ? Prefix + Name_ + "|"
: "" ) );
}
}

but I would prefer to use
std::eek:stream& operator<<( /* what goes here? */ )

The problem I see is that I need to pass that extra parameter, a
std::string, which is used in the recursion. Is something like this
allowed?
outfile << Skills( "" ) << SomethingElse

Could you do something like:

std::eek:stream& operator<<(std::eek:stream& o, const CSkill& c)
{
c.Write(o, "");
return o;
}

?
 
S

Stuart Redmann

Jim said:
I have a CSkill class which is rather complex as it is recursive. That is:

[snip (a rather lengthy class declaration)]
Well, to output this class to an ostream, I use this function:

void CSkill::Write( std::eek:stream& os, const std::string& Prefix ) const
{

[snip (we don't care)]
}

but I would prefer to use
std::eek:stream& operator<<( /* what goes here? */ )

The problem I see is that I need to pass that extra parameter, a
std::string, which is used in the recursion. Is something like this
allowed?
outfile << Skills( "" ) << SomethingElse

If you like so. One way would be add operator () to CSkill like this:

class CSkill
{
private:
std::string m_pAdditionalParameter;
public:
CSkill& operator () (const std::string& p_pAdditionalParameter)
{
m_pAdditionalParameter = p_pAdditionalParameter;
return *this;
}

// Now the rest of your class.
};

The operator<< will now look like this:

std::eek:stream& operator<< (std::eek:stream& os, CSkill& p_Skill)
{
p_Skill.Write (os, m_pAdditionalParameter);
return os;
}


Regards,
Stuart
 
J

Jim Langston

Marcus Kwok said:
Could you do something like:

std::eek:stream& operator<<(std::eek:stream& o, const CSkill& c)
{
c.Write(o, "");
return o;
}

?

I actually thought about that about 2 minutes before checking for responses.
That's a good idea and I think that's the way I'll go. The parm going into
the top level is an empty string "" so I don't have to change it.

Good thinking.
 

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

Forum statistics

Threads
473,982
Messages
2,570,189
Members
46,735
Latest member
HikmatRamazanov

Latest Threads

Top