使用输入文件流C ++初始化对象的构造函数

时间:2012-02-05 23:56:44

标签: c++ constructor inputstream filestream

我的“记录”构造函数如下所示:

#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(不是标准字符串),运算符&gt;&gt; ,getline和运算符&lt;&lt;在istream上定义如下

#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;
}

我将ifstream静态发送到istream,因为我意识到编译器不接受我的“getline”和运算符&lt;&lt; for String和operator&lt;&lt;对于带有ifstream的字符串。我仍然不知道这是否是正确的方法

我的编译器错误现在包括:

  

“Record.cpp:在构造函数中'Record :: Record(std :: ifstream&amp;)':   Record.cpp:26:错误:类型无效static_cast   输入'std :: basic_ifstream&gt;'   “的std :: istream的&安培;”

我在red_hat linux机器上使用标志“g ++ -c -pedantic -Wall -fno-elide-constructors”进行编译

1 个答案:

答案 0 :(得分:0)

在您的情况下,我认为您必须了解ifstreams实现istream接口。您的Record构造函数实际上不需要ifstream。里面的所有代码都只使用istream的公共接口。所以你只需要让你的Record构造函数采用istream&amp; (不是ifstream&amp;)。这也将使您的Record类更加通用,因为您可以将它与各种istream一起使用,而不仅仅是文件输入流。

但是,您的String类重载看起来很好。我怀疑从你试图使用static_cast fstream到istream的方式(这是一个upcast并且永远不应该被明确要求而且也不应该被完成),你试图解决的原始问题是你没有所有相关领域都包含适当的标题。确保在必要时包含istream,ostream和fstream,而不仅仅是iosfwd或iostream。如果编译器在尝试将fstream引用传递给期望istream&amp;的函数时出错,那么肯定是错误的,最可能的解释是前向声明和缺失包含。