2013-08-15 2 views
0

Я пытаюсь перегрузить 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

Избегайте новых/удаления: В вашей основной вам это не нужно. На самом деле, вы могли бы просто оценить свою крошечную структуру данных, но, передавая по ссылке const, я считаю хорошей привычкой для не встроенных. –

ответ

3

Поскольку c является указателем, вы хотите использовать

cout << *c; 
11

c не является объектом карты. Это указатель на объект карты. Если вы хотите использовать ваш оператор с этим, необходимо разыменованием его, как это:

cout << *c; 

Но тогда, почему c указателя в любом случае? Если вы хотите объект Card, просто сделайте его. Здесь нет причин для динамического распределения.

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

Ваш код имеет утечку памяти в любом случае. Для каждого new вам нужен delete. Прекратите использовать new, и вам не нужно delete.

+0

Я предполагаю, что 416 байт/колода не будет слишком сильно увеличивать стек. Конечно, 'class Casino' может потребовать некоторых распределений кучи. –

+1

@ebyrob: Может быть, но его код по-прежнему не нужен 'new'. Любые требуемые динамические распределения, безусловно, могут обрабатываться стандартными библиотечными контейнерными классами. –

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; 
Смежные вопросы