2011-04-03 8 views
6

game.hpuntero tienda a istream y ostream en una clase de C++

#ifndef GAME_H 
#define GAME_H 
#include <string> 
#include <iostream> 
#include "piece.h" 

using namespace std; 

class Game 
{ 
    private: 
     string white; 
     string black; 
     string title; 
     istream* in; 
     ostream* out; 
    public: 
     Game(); 
     Game(istream&, ostream&); 
     void display(Colour, short); 
}; 

#endif 

game.cpp

#include <iostream> 
#include <string> 
#include <sstream> 
#include "game.h" 
#include "board.h" 
#include "piece.h" 

using namespace std; 

Game::Game() 
{ 
    //nothing 
} 

Game::Game(istream& is, ostream& os) 
{ 
    in = is; 
    out = os; 
} 

void Game::display(Colour colour, short moves) 
{ 
    //out << "a"; 
} 

Estoy intentando utilizar el istream y ostream en otras partes de mi clase, pero No puedo porque g ++ no me deja referencia es para. ¿Alguna idea?

Respuesta

6

Simplemente desea una variable de referencia, no un puntero.

class Game 
{ 
    private: 
     ... 
     istream& in; 
     ostream& out; 
    public: 
     Game(istream&, ostream&); 
}; 

Game::Game(istream& is, ostream& os) 
    : in(is), 
     out(os) 
    { } 

El código existente compila debido a peculiaridades lingüísticas pareja:

  • istream/ostream son convrtible a void* para que pueda comprobar su estado de error como en

    if(in) { do_something(in); } 
    
  • su compilador aparentemente permitió que void* se convirtiera a ostream* (Seré cree por error, y al menos debería recibir una advertencia de esto).

+0

También utilicé la ayuda de http://stackoverflow.com/questions/366955/obtain-a-stdostream-either-from-stdcout-or-stdofstreamfile/366969#366969 – Steven

2

is no es una referencia de un puntero, por lo tanto, si desea almacenar un puntero es necesario utilizar el operador de dirección in = &is;

Pero por favor, se dan cuenta de que is puede dejar de existir inmediatamente después de la llamada al método, por lo tanto, se puede fácilmente termina con un puntero no válido. Asegúrese de documentar al menos este hecho.

+0

cabo << "a" me da: game.cpp: En función de miembro 'Juego vacío :: display (color, short int)': game.cpp: 23: error: operandos no válidos de tipos 'std :: ostream *' y 'const char [2]' a operador binario '' – Steven

+0

@Steven Porque 'in' ES un puntero. Por lo tanto, si desea utilizar la secuencia a la que apunta, debe utilizar el operador de eliminación de referencias '* out' –

+0

@Let_Me_Be Gracias, pero ahora proporciona una falla de segmentación en esa línea. – Steven

4

Usted debe deferencia el puntero:

*out << "a"; 

Para un uso más conveniente, a la deferencia no los punteros en cada ocasión, y para más facilidad de lectura que puede usar referencias en lugar de punteros.

class Game 
{ 
    // ... 
    std::istream& in; // notice explicit namespace std:: 
    std::ostream& out; 
    // ... 
}; 

entonces usted puede escribir:

out << "a"; 

Además, no es un buen hábito de hacerlo:

using namespace std; 

De esta manera se está exponiendo a los nombres de espacio de nombres std.

+0

@Magnus ¡Gracias! Corregido +1 –

1

Si almacena punteros, debe desreferenciarlos, como *in o *out << ....

Cuestiones relacionadas