Конструктор, который инициализирует объект с использованием входного файлового потока C ++ - PullRequest
1 голос
/ 06 февраля 2012

Мой конструктор «Запись» выглядит так:

#include "Record.h"  //both these headers #include <iostream>
#include "String.h"

Record :: Record(std::ifstream& is)
{
    std :: istream & iss = static_cast<std::istream &>(is);
    iss >> ID >> medium >> rating;
    getline(iss, title);        
    if (!iss.good())        
        throw Record_exception(invalid_data);
}

где ID - это int, medium и title - это пользовательский тип String (не стандартная строка), для которого операторы >>, getline и operator << определены в istream следующим образом </p>

#include "String.h"

ostream& operator << (ostream& os, const String & s)
{   
    int str_length = s.size(); 
    for (int i = 0; i < str_length ; i++)
        os << s[i];
    return os;
}

istream& operator >> (istream& is, String& str)
{
    char input;
    bool string_end = false;
    int length = 0;
    str.clear();
    while (!string_end){
        is.get(input);
        if (!isspace(input) && is){
            length++;
            str +=input;
             }else if (length || !is)
            string_end = true;
    }   
    return is;
}


istream& getline(std::istream& is, String& str)
{
    char input;
    bool string_end = false;
    int length = 0;
    str.clear();
    while (!string_end){
        is.get(input);
        if (!isspace(input) && is){
            length++;
            str +=input;
        }else if ((length && is.peek() == '\0') || !is)
            string_end = true;
    }   
    return is;
}

я static_casted ifstream istream, потому что я понял, что компилятор не принимает мои "getline" и operator << для String и operator << для строки с ifstream. Я до сих пор не знаю, если это правильный подход, однако </p>

моя ошибка компилятора СЕЙЧАС включает в себя:

"Record.cpp: в конструкторе ord Record :: Record (std :: ifstream &)’: Record.cpp: 26: ошибка: недопустимый static_cast от типа ‘Std :: basic_ifstream>’ для ввода «Станд :: IStream &»

я компилирую с флагами "g ++ -c -pedantic -Wall -fno-elide-constructors" на машине linux red_hat

1 Ответ

0 голосов
/ 06 февраля 2012

В вашем случае, я думаю, вы должны понимать, что ifstreams реализуют интерфейс istream. Ваш конструктор записей на самом деле не нуждается в ifstream. Весь код внутри использует только открытый интерфейс istream. Так что вам нужно только заставить ваш конструктор Record принимать istream & (не ifstream &). Это также сделает ваш класс Record более общим, поскольку вы можете использовать его со всеми видами потоков ist, а не только с потоками ввода файлов.

Однако перегрузки вашего класса String выглядят нормально. Я подозреваю, что из-за того, как вы пытаетесь использовать static_cast fstream для istream (это upcast, и его никогда не требуется явно, а также не следует делать), исходная проблема, которую вы пытались обойти, заключается в том, что у вас нет соответствующие заголовки включены во все соответствующие области. Убедитесь, что вы включили istream, ostream и fstream при необходимости, а не просто iosfwd или iostream. Если компилятор выдает ошибки, пытаясь передать ссылку fstream на функцию, которая ожидает istream &, что-то определенно не так, и наиболее вероятным объяснением являются предварительные объявления и пропущенные включения.

...