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