2011-04-03 19 views
6

game.h में ostream कोस्टोर सूचक iStream और एक वर्ग सी ++

#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 ++ मुझे संदर्भ देने की अनुमति नहीं देगा। कोई विचार?

उत्तर

6

आप बस एक संदर्भ चर चाहते हैं, एक सूचक नहीं।

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

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

मौजूदा कोड क्योंकि एक जोड़ी भाषा quirks के संकलित:

  • istream/ostream में जिस रूप में

    if(in) { do_something(in); } 
    
  • अपनी गलती की स्थिति की जांच करने की अनुमति void* को convrtible हैं आपके कंपाइलर ने को ostream* में परिवर्तित करने की अनुमति दी है (मैं हो त्रुटि में झुकाव, और आपको कम से कम इस से एक चेतावनी मिलनी चाहिए)।

+0

मैंने http://stackoverflow.com/questions/366955/obtain-a-stdostream-either-from-stdcout-or-stdofstreamfile/366969#366969 से सहायता का भी उपयोग किया – Steven

2

is एक संदर्भ नहीं एक सूचक है, इसलिए यदि आप एक सूचक संग्रहीत करना चाहते हैं तो आपको पता ऑपरेटर in = &is;

उपयोग करने के लिए लेकिन कृपया पता है कि is विधि कॉल के तुरंत बाद अस्तित्व समाप्त हो सकता है की जरूरत है, इसलिए आप कर सकते हैं आसानी से एक अमान्य सूचक के साथ समाप्त होता है। सुनिश्चित करें कि आप कम से कम इस तथ्य को दस्तावेज करते हैं। ,

*out << "a"; 

और अधिक सुविधाजनक उपयोग के लिए संकेत हर बार सम्मान नहीं करने के लिए और भी बहुत कुछ पठनीयता के लिए आप संकेत के बजाय संदर्भ का उपयोग कर सकते हैं:

+0

बाहर << "एक" मुझे देता है: game.cpp: सदस्य समारोह में 'शून्य खेल :: प्रदर्शन (रंग, लघु पूर्णांक)': game.cpp: 23: त्रुटि: प्रकार की अमान्य operands 'std :: ostream *' और 'const const char [2]' बाइनरी 'ऑपरेटर <<' – Steven

+0

@Steven क्योंकि 'इन' एक सूचक है। इसलिए यदि आप स्ट्रीम का उपयोग करना चाहते हैं तो यह इंगित कर रहा है कि आपको ड्रेरेंस ऑपरेटर '* आउट' –

+0

@Let_Me_Be धन्यवाद का उपयोग करना होगा, लेकिन अब यह उस लाइन पर सेगमेंटेशन फॉल्ट देता है। – Steven

4

आप सूचक आदर करना चाहिए।

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

तो फिर तुम लिख सकते हैं:

out << "a"; 

साथ ही, यह ऐसा करने के लिए एक अच्छी आदत नहीं है:

using namespace std; 

इस तरह आप एसटीडी नाम स्थान के नाम उजागर कर रहे हैं।

+0

@Magnus धन्यवाद! सही किया। +1 –

1

यदि आप पॉइंटर्स स्टोर करते हैं, तो आपकोया *out << ... जैसे उन्हें हटाना होगा।

संबंधित मुद्दे