【发布时间】:2009-12-03 13:58:24
【问题描述】:
嗯,我认为我的问题源于对基本 C++ 概念的知识湖。问题是,在我的代码(如下)中,我有 Header 和 Register 类。对于这两者,我传递了对已打开的 ifstrem 文件的引用。 Header 从中读取一些字节。 Register 有一个方法来返回 Header 的引用(在 Register 构造函数中传递)。
问题是,当我将 Header 的引用声明为 const(在我的 Register 类中)时,我收到一条错误消息:
error C2662: 'Header::Field_1' : cannot convert 'this' pointer from 'const Header' to 'Header &'
我想问题是:
Field_1 方法通过 seekg 改变文件光标。因此这个成员对象不能是 const (它的内部结构正在改变)。在 Header 类中声明 fstream _stream,并且对此类有 const 引用,是否也使其所有内部成员都为 const?
PS:我正在使用 VS C++ express。下面的代码没有做任何有用的事情,只是一个例子。
// ********** HEADER.H ***********
#ifndef __HEADER_H__
#define __HEADER_H__
#include <fstream>
class Header
{
private:
std::ifstream* _stream;
unsigned long field1;
public:
Header(std::ifstream* stream);
~Header() { }
unsigned long Field_1(void);
};
class Register
{
private:
const Header& _header;
std::ifstream* _stream;
public:
Register(const Header& header, std::ifstream* stream);
~Register(){ }
const Header& GetHeader(void) { return _header; }
};
#endif /*__HEADER_H__*/
//********* PROGRAM.CPP *************
#include <iostream>
#include "header.h"
using namespace std;
Header::Header(ifstream* stream) : _stream(stream)
{
}
unsigned long Header::Field_1(void)
{
_stream->seekg(0x00, fstream::beg);
_stream->read(reinterpret_cast<char*>(&field1), sizeof(field1));
return field1;
}
Register::Register(const Header& header, std::ifstream* stream): _header(header), _stream(stream)
{
}
int main(void)
{
ifstream file("test.dat", ios::binary | ios::in);
Header h(&file);
Register reg(h, &file);
cout << "Field 1 " << reg.GetHeader().Field_1() << endl;
file.close();
return 0;
}
【问题讨论】:
-
你为什么声明
Register::GetHeader(void)首先返回一个constHeader&?