在C ++类中存储指向istream和ostream的指针

时间:2011-04-03 10:36:08

标签: 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";
}

我正在尝试在我班级的其他部分使用istream和ostream,但我不能,因为g ++不会让我参考。有什么想法吗?

4 个答案:

答案 0 :(得分:6)

您只需要一个引用变量,而不是指针。

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

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

现有代码由于一些语言怪癖而编译:

  • istream / ostream可以void*兑换,以便您检查其错误状态,如

      if( in ) { do_something( in ); }
    
  • 您的编译器显然允许将void*转换为ostream*(我相信错误,您至少应该收到警告)。

答案 1 :(得分:4)

您应该遵循指针:

*out << "a";

为了更方便的使用,每次都不要使用指针,为了更好的可读性,你可以使用引用而不是指针。

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

然后你可以写:

out << "a";

另外,这样做不是一个好习惯:

using namespace std;

通过这种方式,您将公开std名称空间的名称。

答案 2 :(得分:2)

is是引用而非指针,因此如果要存储指针,则需要使用地址运算符in = &is;

但请注意,is在方法调用后可能会立即停止存在,因此您很容易就会得到一个无效指针。确保你至少记录了这一事实。

答案 3 :(得分:1)

如果存储指针,则需要取消引用它们,例如*in*out << ...