使用>>指向fstream问题的指针操作者?

时间:2015-05-09 20:23:34

标签: c++ pointers fstream cin istream

我正在尝试使用文件流来读取输入,当我在类之间传输文件时,我需要能够维护指向文件的指针。以下是我正在尝试做的大致概述:

class A {
friend class B;
public:
    void somefunction();

private:
    fstream o;
    B b;
};

class B {
   fstream * in;

   public:
        void input();
        void modify(fstream *);
};

这是我正在尝试使用的两个类的简单表示。我有一个修改fstream的函数:

void A::somefunction() {
    B.modify(o);
}

void B::modify(fstream * o) {
     this -> in = o;
}

这里我传递另一个fstream,以便B类现在维护一个指向该文件的指针。但是,当我尝试使用它读取输入时,我失败了:

void B::input() {
    while (*in >> object) {
        cout << object << endl;
    }
}

语句简单地计算为false,而while循环不执行。我想知道它是否是流的问题,但我不确定。有没有人有任何建议?

编辑:

B b;
b.modify(o);

我想将A {4}中的fstream o传递到B类。我将A类中的fstream * in设置为B类中的fstream o。我忘了添加该fstream o正在读取文件,我想基本上将流“传输”到B类,以便它可以从文件中读取。

1 个答案:

答案 0 :(得分:1)

首先,streams are not copyable(他们的拷贝构造函数在预C ++ 11中是私有的,在C ++ 11和C ++ 14中删除)。如果您有fstream类型的成员,则需要std::move(使用C ++ 11或更高版本)。如果你不想使用(不能使用)C ++ 11,那么你需要传递指针(或引用)。以下是使用指针执行此操作的一种方法:

#include <iostream>
#include <fstream>

class A
{
    std::fstream* o; // pointer to fstream, not fstream
public:
    A(std::fstream* o): o(o) {}
    std::fstream* get_fstream() const
    {
        return o;
    }
};

class B
{
    std::fstream* in;
public:
    void modify(std::fstream* o)
    {
        this -> in = o;
    }
    void input()
    {
        std::string object;
        while (*in >> object) {
            std::cout << object << std::endl;
        }
    }
};

int main()
{
    std::fstream* ifile = new std::fstream("test.txt");
    A a(ifile);
    B b;
    b.modify(a.get_fstream());
    b.input();
    delete ifile;
}

我更喜欢指针与引用,因为引用必须初始化,以后不能更改。