繁体   English   中英

当我有const ref到该类的对象时,该类的非const内部成员会变为const吗?

[英]Do non const internal members of class become const when I have const ref to an object of that class?

好吧,我认为我的问题源于对基本C ++概念的了解。 问题是,在我的代码中(下面),我有Header和Register类。 对于这两者,我都传递对已经打开的ifstrem文件的引用。 标头从中读取一些字节。 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()函数返回const Header & 因此,您不能通过此引用调用任何非const成员函数。

为了解决您的问题,我希望您要使Header::Field_1()函数为const。

即。 声明为unsigned long Field_1(void) const;

是的,当GetHeader()返回对Header对象的const引用时,您只能在其上调用const方法。 在这种情况下,如果通过以下方式将Field_1声明为const方法:

unsigned long Header::Field_1(void) const

(注意最后的const)

麻烦的是,如果您执行此操作,则 const方法中,所有其他成员也会显得也都是const(除非您将它们标记为可变的)。

结果,您可能会对reinterpret_cast<char*>(&field1)感到麻烦。

在这种情况下,最简单的解决方案可能是让GetHeader()返回一个非常量引用。 或者,您可以将field1标记为mutable (但是,如果您沿这条路线行驶,请确保首先了解mutable的语义和危险。我的感觉是让GetHeader()返回非const引用是您真正想要的)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM