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
,以在我的类中的其他方法中检查该类的某些特定方法,而共享缓冲区不允许我这样做(我认为)。