Nano Hash - криптовалюты, майнинг, программирование

Почему fstream не использует прототип оператора istream››?

У меня есть класс, который использует функцию друга для перегрузки оператора>>. Метод перегруженных операторов хорошо тестируется при стандартном использовании cin. Однако, когда я пытаюсь обновить код для использования объектов ifstream вместо объектов istream, прототип не распознается как допустимый метод.

Насколько я понимаю, ifstream наследуется от istream, и поэтому полиморфизм должен позволять объектам ifstream работать с перегруженной функцией istream. Что не так с моим пониманием?

Нужно ли дублировать функцию для каждого типа входного потока?

Класс:

#include <iostream>
#include <cstdlib> 
#include <fstream>

using namespace std;

class Hospital {
public:
    Hospital(std::string name);
    std::string getName();
    void write();
    friend ostream & operator<<( ostream &os, Hospital &hospital );
    friend istream & operator>>( istream &is, Hospital &hospital );
private:
    void readFromFile( std::string filename );
    std::string m_name;
};

реализация функции:

istream &operator>>( istream &is, Hospital &hospital ){
    getline( is, hospital.m_name );
    return is;
}

Ошибка:

Hospital.cpp: в функции-члене 'void Hospital::readFromFile(std::string)': Hospital.cpp:42:24: ошибка: нет соответствия для 'operator>>' (типы операндов 'std::ifstream {aka std::basic_ifstream}' и 'Больница*') storeDataFile >> this;

Эта ошибка возникает в стеке после вызова readFromFile, который я копирую сюда для полноты картины:

/**
 * A loader method that checks to see if a file exists for the given file name.
 * If no file exists, it exits without error. If a file exists, it is loaded
 * and fills the object with the contained data. WARNING: This method will overwrite
 * all pre-existing and preset values, so make changes to the class only after
 * invoking this method. Use the write() class method to write the data to a file.
 * @param filename
 */
void Hospital::readFromFile(std::string filename) {
    ifstream storedDataFile( filename.c_str() );
    if( storedDataFile ){
        storedDataFile >> this;
        storedDataFile.close();
    }
}

В этой ситуации this — это объект Hospital.

Любая помощь и идеи приветствуются. Я переучиваю себя C++ и ищу более глубокое понимание языка и его процессов.

07.09.2015

  • this — это указатель на объект Hospital. 08.09.2015
  • Возьмите имя по константной ссылке, и вы также можете вернуть имя из getName по константной ссылке, если это просто член класса. operator<< должен брать Hospital по константной ссылке. 08.09.2015

Ответы:


1

Вам придется использовать:

storedDataFile >> *this;
               // ~~ dereference the `this` pointer (i.e. Hostipal Object)
              /* Enabling the match for operator>>( istream &is, Hospital &hospital ) */
07.09.2015
  • Великолепно! Я совсем забыл, что оператор '-›' разыменовывает это автоматически, так что без него мне приходится разыменовывать вручную! Большое спасибо! У меня есть ограничение по времени, прежде чем я смогу принять ваш ответ, я вернусь после истечения срока, чтобы начислить вам баллы. Еще раз спасибо! 08.09.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..