0

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

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

那么如果我尝试用我的超载输出卡片operator<<

地址输出而不是说'5 of Clubs'

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

3 回答 3

11

c不是卡片对象。它是一个指向 Card 对象的指针。如果你想使用你的操作符,你需要取消引用它,像这样:

cout << *c;

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

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

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

于 2013-08-15T15:10:58.503 回答
3

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

cout << *c;
于 2013-08-15T15:10:39.910 回答
2

operator<<的声明为:

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

它需要对 a 的const引用Card作为第二个参数。

但在这段代码中:

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

// ...
cout << c;

您正在向它传递一个指向Cardobject的指针。


您可以通过两种方式解决此问题:

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;
于 2013-08-15T15:14:43.113 回答