重载operator <<输出地址而不是数据成员

bli*_*eus 0 c++ operator-overloading

我正在尝试重载operator<<但我继续将地址作为输出.

例如a Card *c = new Card(5,3);

那么如果我尝试用我的重载输出卡operator<<,

地址输出而不是说'5俱乐部'

cout << c;    //0x100100ff0  ?????????????
Run Code Online (Sandbox Code Playgroud)
//Card.h

#ifndef JS_CARD_H
#define JS_CARD_H

#include <ostream>
using std::ostream;

#include <string>
using std::string;

#include <vector>
using std::vector;

namespace JS {
    class Card {

    friend ostream &operator<<(ostream &out, const Card &rhs);

    public:
        enum Suit { DIAMONDS, HEARTS, SPADES, CLUBS };
        enum Rank { ACE = 1, JACK = 11, QUEEN = 12, KING = 13 };

        Card(int rank, int suit) : rank(rank), suit(suit){}

        string getRank() const;
        string getSuit() const;
        int getRankValue() const;

        int operator+(const Card& rhs);
        void displayCard(const Card &rhs);

    private:
        int rank;
        int suit;
    };

}

#endif
Run Code Online (Sandbox Code Playgroud)
//Card.cpp

ostream
&operator<<(ostream &out, const Card &rhs) {

    out << rhs.getRank() << " o f" << rhs.getSuit();

    return out;
}

string
Card::getSuit() const {

    switch (suit) {
        case SPADES:   return "Spades";   break;
        case HEARTS:   return "Hearts";   break;
        case DIAMONDS: return "Diamonds"; break;
        case CLUBS:    return "Clubs";    break;
        default:       return "";         break;
    }
}

string
Card::getRank() const {
    switch (rank) {
        case ACE:   return "Ace";   break;
        case JACK:  return "Jack";  break;
        case QUEEN: return "Queen"; break;
        case KING:  return "King";  break;
        default:
            stringstream out;
            out << rank;

            return out.str();
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)
//main.cpp

#include "Deck.h"
#include "Card.h"

#include <iostream>
using std::cout;

using namespace JS;

int main(int argc, const char * argv[]) {

    Card *c = new Card(5,3);
    Card *c1 = new Card(1,1);

    cout << c;      //0x100100ff0  ?????????????
    cout << '\n';   //5 of Clubs  
    c->displayCard();

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*ley 11

c不是卡片对象.它是一个指向Card对象的指针.如果你想使用它的运算符,你需要取消引用它,如下所示:

cout << *c;
Run Code Online (Sandbox Code Playgroud)

但那么,为什么c指针呢?如果你想要一个Card对象,只需要一个.这里没有动态分配的理由.

Card c(5, 3);
cout << c;
Run Code Online (Sandbox Code Playgroud)

无论如何,您的代码都有内存泄漏.对于每一个人new,你需要一个delete.停止使用new,你不需要delete.