Класс в C ++, который реализует потоки - PullRequest
4 голосов
/ 22 мая 2011

Я хочу написать класс Map с двумя функциями: сохранить и загрузить. Я хотел бы использовать потоки, чтобы я мог написать в своей программе: map << "имя карты" </strong> и она загружает карту в память, а map >> "имя карты" и сохраняет мою карту.

К сожалению, в Google я могу найти только как переопределить операторы '>>' '<<', но используя cout или cin в левой части оператора. </p>

Можете ли вы дать мне те же советы, как это сделать? Спасибо за ответ заранее.

Ответы [ 2 ]

3 голосов
/ 22 мая 2011

перегружают операторы << и >> и объявляют их как friend вашему классу, а затем используют их.Вот пример кода.

#include <iostream>
#include <string>
using namespace std;
class Map
{
   friend Map& operator << (Map &map, string str);
   friend Map& operator >> (Map &map, string str);
};

Map& operator << (Map &map, string str)
{
  //do work, save the map with name str
  cout << "Saving into \""<< str << "\"" << endl;

  return map;
}

Map& operator >> (Map &map, string str)
{
  // do work, load the map named str into map
  cout << "Loading from \"" << str << "\"" << endl;

  return map;
}

int main (void)
{
  Map map;
  string str;

  map << "name1";
  map >> "name2";
}

Обратите внимание, что ваша цель - интерпретация возврата объекта, потому что obj << "hello" << "hi"; может означать загрузку obj как "привет", так и "привет""?или добавить их в таком порядке, это зависит от вас.Также obj >> "hello" >> "hi"; может означать сохранение obj в двух файлах с именами "привет" и "привет"

2 голосов
/ 22 мая 2011

Вот простая иллюстрация, как вы можете перегрузить operator<< и operator>>

class Map
{

   Map & operator<< (std::string mapName)
   {
       //load the map from whatever location
       //if you want to load from some file, 
       //then you have to use std::ifstream here to read the file!

       return *this; //this enables you to load map from 
                     //multiple mapNames in single line, if you so desire!
   }
   Map & operator >> (std::string mapName)
   {
       //save the map

       return *this; //this enables you to save map multiple 
                     //times in a single line!
   }
};

//Usage
 Map m1;
 m1 << "map-name" ; //load the map
 m1 >> "saved-map-name" ; //save the map

 Map m2;
 m2 << "map1" << "map2"; //load both maps!
 m2 >> "save-map1" >> "save-map2"; //save to two different names!

В зависимости от сценариев использования может быть нежелательно использовать две или более карт в одном объекте. Если это так, то вы можете сделать тип возврата оператора << </em> void.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...