C ++ bitset reference - PullRequest
       27

C ++ bitset reference

0 голосов
/ 07 ноября 2019

Два вопроса по ссылке на бит:

Q1. Есть ли способ вернуть закрытый член класса? В приведенном ниже фрагменте кода (с последующим выводом) я экспериментировал с обычной ссылкой, но она даже не изменяет элемент bitset в классе Foo.

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 )

1 Ответ

5 голосов
/ 07 ноября 2019

С

auto b3 = f.get_b1_ref();

выведенный тип будет не справочным, только базовый тип bitset<4>. Это означает, что b3 не является ссылкой, и все модификации b3 или его содержимого будут ограничены самим объектом b3.

Чтобы получить ссылку, вам нужно явно использовать & вдекларация:

auto& b3 = f.get_b1_ref();
...