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 ++不会让我参考。有什么想法吗?
答案 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 << ...
。