重载运算符<<输出地址而不是数据成员
overloaded operator<< outputs an address instead of data members
我试图重载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;
相关文章:
- 将数组的地址分配给变量并删除
- 空基优化子对象的地址
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 如何在c++程序中找到函数的地址
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 被解释为低级别const的const对象的地址
- 将地址分配给本地指针后,公共对象的变量将消失
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 内联程序集printf将整数解释为地址
- 为什么指针不写入类的地址?
- 如何在C++中获取该对象的类声明中对象的地址?
- 通过按地址访问变量
- <<操作员在下面的行中工作
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 函数名是c中该函数的第一条指令的地址吗
- 重载运算符<<输出地址而不是数据成员