簡體   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