C++ C++;作为类成员的流引用

C++ C++;作为类成员的流引用,c++,stl,reference,stream,C++,Stl,Reference,Stream,我有一门课是这样的: #include <iostream> class A { public: A (std::istream& is): _is(is) {} void setInputSource (std::istream& is) { _is = is; } A& operator>> (int& x) { _is >> x; ret

我有一门课是这样的:

#include <iostream>

class A {
public:
    A (std::istream& is): _is(is) {}

    void setInputSource (std::istream& is) {
        _is = is;
    }

    A& operator>> (int& x) {
        _is >> x;
        return *this;
    }

private:
    std::istream& _is;
};
int main() {
    int a, b;

    std::ifstream ifs("myfile.txt");
    A myA(std::cin);

    myA >> a;
    myA.setInputSource(ifs);
    myA >> b;

    return 0;
}

我想改用指针,但我更喜欢使用引用,因为它们保证不会有无效值,而且在我看来,这是一种更优雅的方法。

在已绑定引用之后,无法将其绑定到其他对象。这是使用指针和使用引用之间的根本区别之一。因此,使用指针更合适

我更喜欢使用引用,因为它们保证不会有无效值


这不是真的。如果引用绑定到的对象被销毁,则它引用的对象无效,就像指针一样。

您不能这样做。定义引用的唯一方法是在构造函数中

它实际上非常方便,因为这保证了对象在它所依赖的引用之前会超出范围

例如,在您的设计中,可能会将myA置于无效状态

int main() {
    int a, b;

    A myA(std::cin);
    myA >> a;

    {
       std::ifstream ifs("myfile.txt");
       myA.setInputSource(ifs);
    }

    myA >> b;

    return 0;
}

当然,你仍然可以用指针击中自己的脚。

听起来你只是想改变缓冲区:

class A
{
public:
    A (std::istream& is)
        : m_is(is.rdbuf())
    { }

    void setInputSource(std::istream& is) {
        m_is.rdbuf(is.rdbuf());
    }

    // ...

private:
    std::istream m_is;
};

问题是,我将动态地向下转换到
std::ifstream
,以在我的类中的其他方法中检查该类的某些特定方法,而共享缓冲区不允许我这样做(我认为)。