重载运算符<<输出地址而不是数据成员

overloaded operator<< outputs an address instead of data members

本文关键字:lt 地址 数据成员 输出 运算符 重载 输出地      更新时间:2023-10-16

我试图重载operator<<,但我一直将地址作为输出。

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

那么,如果我试图输出带有过载operator<<、的卡

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

cout << c;    //0x100100ff0  ?????????????

//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

//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;
    }
}

//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;
}

c不是Card对象。它是指向Card对象的指针。如果你想使用你的运算符,你需要取消引用它,就像这样:

cout << *c;

但是,为什么c是一个指针呢?如果您想要一个Card对象,只需制作一个即可。这里没有动态分配的理由。

Card c(5, 3);
cout << c;

您的代码仍然存在内存泄漏。对于每个new,您需要一个delete。停止使用new,您就不需要delete

由于c是一个指针,您需要使用

cout << *c;

您的operator<<声明为:

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

它将Card上的const引用作为第二个参数。

但在这个代码中:

Card *c = new Card(5,3);
// ...
cout << c;

您正在向它传递一个指向Card对象的指针。


你可以用两种方法来解决这个问题:

Card *c = new Card(5,3);
cout << *c;
//      ^ To dereference the pointer

Card c(5, 3); // Why do you need a pointer anyway ?
cout << c;