0

关于位集参考的两个问题:

Q1。有什么方法可以返回一个类私有成员位集?在下面的代码片段(后面是输出)中,我尝试了常规引用,但它甚至不会修改 Foo 类中的 bitset 成员。

Q2。从这个问题的答案中,我了解到常规引用没有足够的粒度来指向存储的单个位,bitset因为bitset它们以更紧凑的形式存储。但是,如果这是真的,我的代码如何仍然设法修改 b3 中的第一位b3[1] = 0

#include <iostream>
#include <bitset>

using namespace std;

class Foo 
{ 
private:
    bitset<4> b1;  
public:
    inline void print_value() 
    {
        cout << "The bitset b1 is: ( "<< b1 << " )" << endl;
    }
    inline void set_all() { b1.set(); }
    inline bitset<4> get_b1() { return b1; }
    inline bitset<4>& get_b1_ref() { return b1; }
}; 

int main()
{
    Foo f;
    f.print_value();
    f.set_all();
    f.print_value();
    auto b2 = f.get_b1();
    b2.flip();
    cout << "The bitset b2 is: ( "<< b2 << " )" << endl;
    f.print_value();
    auto b3 = f.get_b1_ref();
    cout << "The bitset b3 is: ( "<< b3 << " )" << endl;
    cout << "b3[0] is ( " << b3[0] << " )"<< endl;
    cout << "b3[0] is ( " << b3[1] << " )"<< endl;
    b3[1] = 0;
    cout << "The bitset b3 after change is: ( "<< b3 << " )" << endl;
    f.print_value();
}

Output:
The bitset b1 is: ( 0000 )
The bitset b1 is: ( 1111 )
The bitset b2 is: ( 0000 )
The bitset b1 is: ( 1111 )
The bitset b3 is: ( 1111 )
b3[0] is ( 1 )
b3[0] is ( 1 )
The bitset b3 after change is: ( 1101 )
The bitset b1 is: ( 1111 )
4

1 回答 1

5

auto b3 = f.get_b1_ref();

推导的类型将不是参考,只有基本类型bitset<4>。这意味着b3不是引用,所有修改b3或其内容将仅限于b3对象本身。

要获得引用,您需要&在声明中明确使用:

auto& b3 = f.get_b1_ref();
于 2019-11-07T12:47:41.903 回答