Как правильно вернуть неизменяемую ссылку на объект из функции в C ++? - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь вернуть const-объект из функции, чтобы я мог получить от него информацию, но ничего нельзя изменить после его создания.У меня есть следующий код

    Sprite const& GetSprite() const {
        return *m_sprite;
    }


    std::unique_ptr<Sprite> m_sprite;
    int test = 5;

Где-то еще в коде, который я называю этой GetSprite функцией

Sprite sprite = entity->GetSprite();
sprite.test = 6;

Кажется, что это нормально компилируется и после перехода по значению в test на самом деле изменилось.Я бы предположил, что объект, возвращенный из GetSprite, не позволит мне изменить объект, но квалификатор const, кажется, отброшен?

Я делаю это неправильно или есть другой подход для достижения этого

1 Ответ

0 голосов
/ 12 декабря 2018
Sprite sprite = entity->GetSprite();

при этом создается копия объекта Sprite, возвращаемого GetSprite, с использованием экземпляра-копира `Sprite.

Редактирование копии не должно приводить к изменению оригинала, если только вынаписали Sprite неправильно, или вы запутались между ссылкой, значением и семантикой указателя.

Sprite const& sprite = entity->GetSprite();

это возвращает ссылку на содержащийся Sprite, через который вы не можете его изменить.

Если вы хотите заблокировать копирование Sprite с, вы можете сделать:

Sprite(Sprite const&) = delete;

, но я бы посоветовал разрешить перемещение Sprite с:

Sprite(Sprite&&) = default;

, особенно предварительно- (когда гарантированное исключение делает его менее важным).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...