John
John

Reputation: 1594

Use print function for output of overloaded << operator?

I have successfully overloaded the '<<' operator which I believe is referred to as the insertion operator. I have a print function which prints the information of an instance of a card object, how can I call this print function when the operator is used

example:

Card aCard("Spades",8);  //generates an 8 of spades card object

aCard.Print(); // prints the suit and value of card

cout << aCard << endl;  // will print something successfully but how can I get the same results as if I were to call the print function?

In my implementation file card.cpp I have overloaded the << for use with my card class.

Card.cpp

void Card::Print()
{
    std::cout << "Suit: "<< Suit << std::endl;
    std::cout << "Value:" << Value << std::endl;
}

std::ostream& operator<<(std::ostream &out, const Card &aCard)
{
    Print();//this causes an error in the program
}

Card.h

class Card
{
public:       
    std::string Suit;
    int Value;

    Card(){};
    Card(std::string S, int V){Suit=S; Value=V};

    void Print();

    friend std::ostream& operator<<(std::ostream&, const Card&)
};

Upvotes: 0

Views: 3249

Answers (2)

shf301
shf301

Reputation: 31404

You do only want one implementation. You could either make a Print function that takes an ostream and performs all of the print logic then call it from Print() and operator<<

void Card::Print()
{
    Print(std::cout);
}

std::ostream& operator<<(std::ostream &out, const Card &aCard)
{
    Print(out);
}

void Card::Print(std::ostream &out)
{
    out << "Suit: "<< Suit << std::endl;
    out << "Value:" << Value << std::endl;
    return out;
}

Or you could have the operator<< contain the print logic and call operator<< from Print:

void Card::Print()
{
    std::cout << *this;
}

std::ostream& operator<<(std::ostream &out, const Card &aCard)
{
     out << "Suit: "<< Suit << std::endl;
     out << "Value:" << Value << std::endl;
     return out;
}

Upvotes: 4

Matt Phillips
Matt Phillips

Reputation: 9691

You need aCard.Print() in operator<< not Print()

std::ostream& operator<<(std::ostream &out, const Card &aCard)
{
    aCard.Print();
}

You don't say what the error is but basically you're calling a globally defined Print() function or a function that doesn't exist with your code as it stands.

Upvotes: 0

Related Questions