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

时间:2013-08-15 15:07:44

标签: c++ operator-overloading

我正在尝试重载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;
}

3 个答案:

答案 0 :(得分:11)

c不是Card对象。它是一个指向Card对象的指针。如果你想使用它的操作符,你需要取消引用它,如下所示:

cout << *c;

但是,为什么c无论如何都是指针?如果你想要一个Card对象,只需要一个。这里没有动态分配的理由。

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

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

答案 1 :(得分:3)

由于c是指针,因此您想使用

cout << *c;

答案 2 :(得分:2)

您的operator<<被声明为:

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

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

但是在这段代码中:

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;