Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Store pointer to istream and ostream in a class C++

Tags:

c++

game.h

#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";
}

I'm trying to use the istream and ostream in other parts of my class but I can't because g++ won't let me reference is to in. Any ideas?

like image 362
Steven Avatar asked Apr 03 '11 10:04

Steven


2 Answers

You simply want a reference variable, not a pointer.

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

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

The existing code compiles because of a couple language quirks:

  • istream / ostream are convrtible to void* to allow you to check their error status as in

      if( in ) { do_something( in ); }
    
  • your compiler apparently allowed void* to be converted to ostream* (I believe in error, and you should at least get a warning from this).

like image 67
Potatoswatter Avatar answered Oct 23 '22 17:10

Potatoswatter


You should deference the pointer:

*out << "a";

For more convenient use, to not deference the pointers each time, and for more readability you can use references instead of pointers.

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

Then you can write:

out << "a";

Plus, it is not a good habit to do so:

using namespace std;

This way you are exposing the names of std namespace.

like image 20
Hovhannes Grigoryan Avatar answered Oct 23 '22 16:10

Hovhannes Grigoryan