现在的位置: 首页 > 综合 > 正文

C++IO对象不可复制或赋值

2014年04月05日 ⁄ 综合 ⁄ 共 1292字 ⁄ 字号 评论关闭

IO类型的3个独立的头文件:

iostream定义读写控制窗口的类型,

fstream 定义读写已命名文件的类型,             (包含fstream类)

sstream定义读写存储在内存中的string对象。(包含了stringstream类)

IO类型不可复制或赋值

因此,IO类型不可存储在vector容器中。(IO是流对象,而流对象是不能复制的,所以不能存储在vector容器中)

在编写程序时,有时会遇到下面所示的一个问题,贴出来,希望对大家有所帮助。

例如:

#include <iostream>
#include <fstream>
using namespace std;

void fun(ofstream ofile)
{
     ofile<<"opq rst"<<endl;
}

int main()
{
     ofstream outfile;
     outfile.open("1.txt", ios::app);
     outfile<<"abcdefg hijklmn"<<endl;
     fun(outfile);
     outfile.close();

     return 0;
}

对于这段程序我们会发现,编译是没有问题的,但是运行时会出现“应用程序错误,该内存不能为read”的错误提示。当我们把函数void fun(ofstream ofile)改为void fun(ofstream &ofile)。即我们传递一个指向ofstream对象outfile的引用过去后,发现错误解决了。

    这种错误一般是由于访问了不该访问的内存而导致的,并且通常都是在使用指针时才会出现。但是,在这个地方究竟是怎么回事呢?经过查阅资料发现,是由于在C++中,IO对象不可复制或赋值所导致的。

IO类型的3个独立的头文件:

    iostream定义读写控制窗口的类型

    fstream 定义读写已命名文件的类型

    sstream定义读写存储在内存中的string对象

    因此,IO类型不可存储在vector容器中。(IO是流对象,而流对象是不能复制的,所以不能存储在vector容器中)

  1. ofstream out1,out2;

  2. out2 = out1; //error : cannot assign stream objects

  3. ofstream print(ofstream);

  4. out2 = print(out2); //error:cannot copy stream objects

形参或返回类型也不能为流类型。如果要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用。

ofstream &print(ofstream&); //ok:takes a reference,no copy

while(print(out2)) { ... }          // ok:pass reference to out2

一般,如果要传递IO对象以便对它进行读写,可用非const引用的方式传递这个流对象。对IO对象的读写会改变它的状态,因此引用必须是非const的

抱歉!评论已关闭.