看过<>的进来一下,发现一个有关问题
看过<<C++编程风格>>的进来一下,发现一个问题
最近我在看一本书,就是Tom Cargill 著,聂雪军 译的一本 < <C++编程风格> > ( < <C++Programming Style> > ,机械工业出版社),看到第五章发现一个问题:
书上给出了一个将文件抽象成字节数组的一个重载运算符的例子,改进后的程序如下:
#include <fstream.h>
#include <iostream.h>
//-----------------------------------------------------
class Index{
friend class FileArray;
public:
Index& operator=(char c);
operator char();
private:
FileArray *fa;
streampos fileptr;
Index(FileArray* _fa,int x);
};
//-----------------------------------------------------
class FileArray{
friend class Index;
public:
FileArray(char* fName):fs(fName,ios::in | ios::out){}
Index operator[] (unsigned x){return Index(this,x);}
private:
FileArray& operator= (const FileArray&);
fstream fs;
};
//-----------------------------------------------------
Index::Index(FileArray* _fa,int x){
fa=_fa;
fileptr=streampos(x);
}
Index& Index::operator=(char c){
fa-> fs.seekp(fileptr,ios::beg);
fa-> fs.write(&c,1);
fa-> fs.flush();
return *this;
}
Index::operator char(){
char buf;
fa-> fs.seekg(fileptr,ios::beg);
fa-> fs.read(&buf,1);
return buf;
}
//-----------------------------------------------------
void main()
{
FileArray f( "e1_1.cpp ");
f[0]=f[1];
}
根据书上的说法f[0]=f[1];一句是可以实现同一文件不同索引字符的赋值的,但是我用BC++5.5和VC6都不能得到结果.
书上说这句相当于
(f.operator[](0)).operator=( (f.operator[](1)).operator char() )
编译时相当于生成两个Index中间变量,然后复制相应的索引对应的值.
但是根据观察和调试,这一过程并不存在,而是系统根据默认的拷贝构造函数和默认重载的赋值运算符完成了一个浅拷贝
我是希望看过这本书的人或者对这个问题有研究的人发表一下看法研究一下,看看是我的理解有问题还是书上的说法有问题
------解决方案--------------------
我试了一下,好像f[0]=f[1];解释成了(f.operator[](0)).operator=( (f.operator[](1)
并没有调用operator char()
------解决方案--------------------
同意lz看法,应该是例子有问题吧。自己定义一个拷贝赋值函数,明确调用一下operator char() 就可以解决了。
最近我在看一本书,就是Tom Cargill 著,聂雪军 译的一本 < <C++编程风格> > ( < <C++Programming Style> > ,机械工业出版社),看到第五章发现一个问题:
书上给出了一个将文件抽象成字节数组的一个重载运算符的例子,改进后的程序如下:
#include <fstream.h>
#include <iostream.h>
//-----------------------------------------------------
class Index{
friend class FileArray;
public:
Index& operator=(char c);
operator char();
private:
FileArray *fa;
streampos fileptr;
Index(FileArray* _fa,int x);
};
//-----------------------------------------------------
class FileArray{
friend class Index;
public:
FileArray(char* fName):fs(fName,ios::in | ios::out){}
Index operator[] (unsigned x){return Index(this,x);}
private:
FileArray& operator= (const FileArray&);
fstream fs;
};
//-----------------------------------------------------
Index::Index(FileArray* _fa,int x){
fa=_fa;
fileptr=streampos(x);
}
Index& Index::operator=(char c){
fa-> fs.seekp(fileptr,ios::beg);
fa-> fs.write(&c,1);
fa-> fs.flush();
return *this;
}
Index::operator char(){
char buf;
fa-> fs.seekg(fileptr,ios::beg);
fa-> fs.read(&buf,1);
return buf;
}
//-----------------------------------------------------
void main()
{
FileArray f( "e1_1.cpp ");
f[0]=f[1];
}
根据书上的说法f[0]=f[1];一句是可以实现同一文件不同索引字符的赋值的,但是我用BC++5.5和VC6都不能得到结果.
书上说这句相当于
(f.operator[](0)).operator=( (f.operator[](1)).operator char() )
编译时相当于生成两个Index中间变量,然后复制相应的索引对应的值.
但是根据观察和调试,这一过程并不存在,而是系统根据默认的拷贝构造函数和默认重载的赋值运算符完成了一个浅拷贝
我是希望看过这本书的人或者对这个问题有研究的人发表一下看法研究一下,看看是我的理解有问题还是书上的说法有问题
------解决方案--------------------
我试了一下,好像f[0]=f[1];解释成了(f.operator[](0)).operator=( (f.operator[](1)
并没有调用operator char()
------解决方案--------------------
同意lz看法,应该是例子有问题吧。自己定义一个拷贝赋值函数,明确调用一下operator char() 就可以解决了。