C++中调用成员的重载<<运算符

Calling member's overloaded << operator in C++

本文关键字:lt 运算符 重载 调用 成员 C++      更新时间:2023-10-16

以下内容引发编译时错误。我不知道如何调用一个对象重载运算符<lt;在另一个对象<lt;操作人员如果有人能指出我做错了什么,那将非常有帮助。谢谢你抽出时间!

card.cpp:

#include "card.h"
#include <iostream>
ostream& operator<<(ostream &out, Card &cCard)
{
    out << cCard.getValueString() 
        << " OF " 
        << cCard.getSuitString() 
        << "Sn";
    return out;
}
string Card::getValueString()
{
    Value value = getValue();
    switch(value) 
    {
        case TWO:           return "TWO";
        case THREE:         return "THREE"; 
        case FOUR:          return "FOUR"; 
        case FIVE:          return "FIVE";
        case SIX:           return "SIX";
        case SEVEN:         return "SEVEN";
        case EIGHT:         return "EIGHT";
        case NINE:          return "NINE";
        case TEN:           return "TEN";
        case JACK:          return "JACK";
        case QUEEN:         return "QUEEN";
        case KING:          return "KING";
        case ACE:           return "ACE"; 
        case NONE_VALUE:    return "NONE_VALUE";
        default:            return "UNKNOWN VALUE";  
    };
}
string Card::getSuitString()
{
    Suit suit = getSuit();
    switch(suit) 
    {
        case SPADE:         return "SPADE";
        case HEART:         return "HEART"; 
        case CLUB:          return "CLUB"; 
        case DIAMOND:       return "DIAMOND";
        case NONE_SUIT:     return "NONE_SUIT";
        default:            return "UNKNOWN SUIT";
    };
}

card.h

#pragma once
#include <iostream>
using namespace std;
 enum Suit  { 
                SPADE, 
                HEART, 
                CLUB, 
                DIAMOND,
                NONE_SUIT 
            };
 enum Value  { 
                TWO=2, 
                THREE, 
                FOUR, 
                FIVE,
                SIX,
                SEVEN,
                EIGHT,
                NINE,
                TEN,
                JACK,
                QUEEN,
                KING,
                ACE, 
                NONE_VALUE
            };
    class Card
    {
        public:
            Card() : m_suit(NONE_SUIT), m_value(NONE_VALUE) { };
            Card(Suit suit, Value value) : m_suit(suit), m_value(value) { };
            Value getValue() { return m_value; };
            Suit getSuit() { return m_suit; };
            void setValue(Value value) { m_value = value; };
            void setSuit(Suit suit) { m_suit = suit; };
            string getValueString();
            string getSuitString();
            friend ostream& operator<<(ostream &out, Card &cCard);
        private:
            Suit m_suit;
            Value m_value;      
    };

hand.cpp:

#include "hand.h"
#include "card.h"
ostream& operator<<(ostream &out, Card &cCard);
Hand::Hand() 
{
}
Card Hand::getCard(int cardIndex) 
{
    if(cardIndex == 0 || cardIndex == 1)
    {
        return cards[cardIndex];
    }
    else
    {
        cout << "Card index out of bounds.n";
    }
    return Card(NONE_SUIT, NONE_VALUE);
}
void Hand::setCard(int cardIndex, Suit suit, Value value)
{
    if(cardIndex == 0 || cardIndex == 1)
    {
        cards[cardIndex].setValue(value);
        cards[cardIndex].setSuit(suit);
    }
    else
    {
        cout << "Card index out of bounds.n";
    }
};
ostream& operator<<(ostream &out, Hand &cHand)
{
    out << cHand.getCard(0) 
        << "n"
        << cHand.getCard(1);
    return out;
}

hand.h:

#pragma once
#include <iostream>
#include "card.h"
using namespace std;
class Hand
{
    public:
        Hand();
        void setCard(int cardIndex, Suit suit, Value value);
        Card getCard(int cardIndex);
        friend ostream& operator<<(ostream &out, Hand &cHand);
    private:
        Card cards[2];      
};

错误如下:

hand.cpp:在函数'std::ostream&运算符<lt;(std::ostream&,Hand&)':hand.cpp:40:错误:不匹配'operator<lt;'输入输出<lt;((Hand*)cHand)->Hand::getCard(0)'/usr/include/c++/4.2.1/osteream:112:注意:候选为:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(std::basic_stream<_CharT,_Traits>&(*)/usr/include/c++/4.2.1/osteream:121:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(std::basic_ios<_CharT,_Traits>&(*)/usr/include/c++/4.2.1/osteream:131:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(std::ios_base&(*)(std::ios_base&))[其中_CharT=char,_Traits=std::char_Traits]/usr/include/c++/4.2.1/osteream:169:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(长整型)[其中_CharT=char,_Traits=std::char_Traits]/usr/include/c++/4.2.1/osteream:173:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(长无符号int)[其中_CharT=char,_Traits=std::char_Traits]/usr/include/c++/4.2.1/osteream:177:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(bool)[其中_CharT=char,_Traits=std::char_Traits]/usr/include/c++/4.2.1/bits/osteream.tcc:92:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(短int)[其中_CharT=char,_Traits=std::char_Traits]/usr/include/c++/4.2.1/osteream:184:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(短无符号int)[其中_CharT=char,_Traits=std::char_Traits]/usr/include/c++/4.2.1/bits/osteream.tcc:106:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(int)[其中_CharT=char,_Traits=std::char_Traits]/usr/include/c++/4.2.1/osteream:195:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(unsigned int)[其中_CharT=char,_Traits=std::char_Traits]/usr/include/c++/4.2.1/osteream:204:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(long-long-int)[其中_CharT=char,_Traits=std::char_Traits]/usr/include/c++/4.2.1/osteream:208:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(long-long unsigned int)[其中_CharT=char,_Traits=std::char_Traits]/usr/include/c++/4.2.1/osteream:213:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(双)[其中_CharT=char,_Traits=std::char_Traits]/usr/include/c++/4.2.1/osteream:217:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(浮点)[其中_CharT=char,_Traits=std::char_Traits]/usr/include/c++/4.2.1/osteream:225:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(长双)[其中_CharT=char,_Traits=std::char_Traits]/usr/include/c++/4.2.1/osteream:229:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(const void*)[其中_CharT=char,_Traits=std::char_Traits]/usr/include/c++/4.2.1/bits/osteream.tcc:120:注意:std::basic_stream&lt_CharT,_Traits>&std::basic_stream&lt_CharT,_Traits>::运算符<lt;(std::basic_streambuf<_CharT,_Traits>*)[其中_CharT=char,_Trait=std::char_Traits]hand.cpp:4:注意:std::ostream&运算符<lt;(std::ostream&,Card&)hand.cpp:38:注意:std::ostream&运算符<lt;(std::ostream&,Hand&)

你知道我缺了什么吗?

您的operator <<函数应该通过const引用获取右侧参数。它告诉您,它无法将getCard返回的临时值绑定到运算符的非常量引用参数。

这个错误消息非常长,因为在任何时候,作用域中都有非常多的<<重载,编译器将所有这些重载都列为"我尝试过这个,但它不起作用。"