?
Solved

scope to operator<<

Posted on 2006-11-24
10
Medium Priority
?
248 Views
Last Modified: 2013-12-14
i have a base class of cRectangle2 and a class that inheritance it cBox

in cRectangle2 i have
friend ostream & operator<<(ostream &,const cRectangle2 &)

now in cBox i also have operator<< overloaded but i dont know how to call the cRectangle operator... i can get it to work with a static_cast but that makes an extra constructor that i should not have... how do i call the cRectangle2 operator inside the cBox operator?

Thanks
0
Comment
Question by:i_dont_have_a_name
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
  • 3
10 Comments
 
LVL 30

Expert Comment

by:Axter
ID: 18008912
Hi i_dont_have_a_name,

Please post your class header so we can have a better understanding of your requirements.


David Maisonave (Axter)
Cheers!
0
 
LVL 17

Expert Comment

by:rstaveley
ID: 18009461
Taking a wild guess at your problem.... Try getting your std::ostream& operator<< to call a virtual function in your base class that takes responsibility for doing the display.

c.f.
--------8<--------
#include <iostream>
#include <string>

class base;
std::ostream& operator<<(std::ostream& os,const base&);

class base {
      virtual std::ostream& display(std::ostream& os) const;
      friend std::ostream& operator<<(std::ostream& os,const base&);
protected:
      const std::string name;
public:
      base(const std::string& name = "base") : name(name) {}
};

std::ostream& operator<<(std::ostream& os,const base& b)
{
      return b.display(os);
}

std::ostream& base::display(std::ostream& os) const
{
      return os << "base: " << name;
}

class derived : public base {
      std::ostream& display(std::ostream& os) const;
public:
      derived(const std::string& name = "derived") : base(name) {}
};

std::ostream& derived::display(std::ostream& os) const
{
      return os << "derived: " << name;
}

void blah(const base& b)
{
      std::cout << "This is a base: " << b << '\n';
}

int main()
{
      base b("benny");
      derived d("danny");
      blah(b);
      blah(d);
}
--------8<--------
0
 

Author Comment

by:i_dont_have_a_name
ID: 18013696
i just wanted to know how to scope down to a friend function but i really dont care any more i just did it the long way


Thanks anyways
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 30

Expert Comment

by:Axter
ID: 18015104
>>but i really dont care any more i just did it the long way

Can you please award points to rstaveley, who gave you a valid method, and close this question?

Thanks
0
 

Author Comment

by:i_dont_have_a_name
ID: 18015696
rstaveley does not really have what i was looking for (have more time to go over it... was on a road trip)...

this is what i have

class cRectangle2 {
      friend ostream & operator<<(ostream & where, const cRectangle2 & t);
       {
             where <<  setw(10) << t.getLength() << setw(10) << t.getWidth();
             return where;
        }

      public:
               .....
               .....
      private:
                ....
                ....
};
////////////////////////////////////////
class cBox : public cRectangle2 {
        // trying to scope to cRectangle2 ostream first then print extra
      friend ostream & operator<<(ostream & where, const cBox & t);
        {
          //      where << t.cRectangle2:: << t.getHeight();  // Does not work
          //      where << static_cast<cRectangle2>(t) << t.getHeight();  //Works but extra constructor
          //      where << cRectangle2(t) << t.getHeight();  //Works but extra constructor
       
                return where;
        }
      public:
               .....
               .....
               .....
      private:
                ....
                ....
};
0
 
LVL 30

Expert Comment

by:Axter
ID: 18015739
>>rstaveley does not really have what i was looking for (have more time to go over it... was on a road trip)...

If you try his implementation, you'll find that it does have what you're looking for.

You need to transfer the logic to a virtual function, and the way to do that, is to have the friend function call the virtual function.
0
 

Author Comment

by:i_dont_have_a_name
ID: 18048662
i found the answeri was looking for all i need to do was this

base & temp = t;
where << t;
0
 
LVL 17

Expert Comment

by:rstaveley
ID: 18048814
OK, I understand your question now. The static cast would amount to the same thing. You wouldn't be calling the copy constructor, but don't take my word for it. Test.
0
 

Author Comment

by:i_dont_have_a_name
ID: 18048919
its not that your code did not work its that i could not change my code around like u had because it was for homwork and part of it was to keep that format
0
 
LVL 17

Accepted Solution

by:
rstaveley earned 375 total points
ID: 18049398
Here you go, with the static cast. No copy construction.

--------8<--------
#include <iostream>

struct base {};

std::ostream& operator<<(std::ostream& os,const base&)
{
      return os << "base";
}

struct derived : public base {};

std::ostream& operator<<(std::ostream& os,const derived&)
{
      return os << "derived";
}

int main()
{
      base b;
      derived d;
      std::cout << b << '\n';
      std::cout << d << '\n';
      std::cout << static_cast<base&>(d) << '\n';
}
--------8<--------
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

What is C++ STL?: STL stands for Standard Template Library and is a part of standard C++ libraries. It contains many useful data structures (containers) and algorithms, which can spare you a lot of the time. Today we will look at the STL Vector. …
Here is a helpful source code for C++ Builder programmers that allows you to manage and manipulate HTML content from C++ code, while also handling HTML events like onclick, onmouseover, ... Some objects defined and used in this source include: …
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question