簡體   English   中英

在C ++類中存儲指向istream和ostream的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM