[英]Store pointer to istream and ostream in a class 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 ++不會讓我參考進來。任何想法?
您只需要一個引用變量,而不是指針。
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*
(我相信錯誤,你應該至少得到一個警告)。
你應該遵循指針:
*out << "a";
為了更方便的使用,每次都不要遵循指針,為了更好的可讀性,你可以使用引用而不是指針。
class Game
{
// ...
std::istream& in; // notice explicit namespace std::
std::ostream& out;
// ...
};
然后你可以寫:
out << "a";
另外,這樣做不是一個好習慣:
using namespace std;
這樣您就可以公開std命名空間的名稱。
is
是引用而不是指針,因此如果要存儲指針,則需要in = &is;
使用地址運算符in = &is;
但請明白, is
可以停止的方法調用后立即存在的,因此,你可以很容易地與無效指針結束。 確保您至少記錄了這一事實。
如果存儲指針,則需要取消引用它們,例如*in
或*out << ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.