возвращение & const или * const? (C ++) - PullRequest
5 голосов
/ 26 декабря 2010

У меня есть свой собственный класс SomeObject с несколькими членами.

Теперь у меня есть другой класс "WorkingClass", который связывается с этим объектом как с приватным членом.

Мой вопрос таков: я хочу создать Getter для «SomeObject», но я не хочу, чтобы кто-либо его изменял.

какой путь лучше, 1 или 2?

class WorkingClass
{
private:
    SomeObject sObj;

public:
    //... 1)
    const SomeObject &const GetSomeObject()
    {
        return mousePosition;
    }

    //... 2)
    const SomeObject *const GetSomeObject()
    {
        return &mouseMovement;
    }
}

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

EDIT:

тогда у меня есть еще один вопрос. когда у меня есть член со смарт-указателем, и я часто использую его внутри класса, а затем вдруг хочу, чтобы кто-то имел доступ к чтению некоторых значений, но не более того, это было бы хорошим решением или это снова было многословно?

class X
{
private:
    boost::shared_ptr<SomeObject> sob

public:
    const const & GetSomeObject()
    {
        return *sob.get();
    }
}

а как насчет возврата "const boost :: shared_ptr <...> GetX ()"? это не может быть действительно необходимым, но все же не бесполезным, поскольку компилятор запретил бы GetX (). reset (..) в таком случае, и без объявления const boost :: ... эта бесполезная операция была бы разрешена. или я не прав?

Ответы [ 2 ]

7 голосов
/ 26 декабря 2010

Нет ничего хорошего:

  • const SomeObject &const плохо сформирован.Вы не можете подтвердить ссылку.(Конечно, вы можете определить тип референта.)

  • const SomeObject *const является излишне многословным.Выражение вызова функции o.GetSomeObject() является выражением rvalue, и только значения типа r могут быть квалифицированы как const.Вы также можете просто сказать const SomeObject*.(const SomeObject *const может на самом деле привести к проблемам с созданием шаблона, хотя такие проблемы встречаются редко.)

Что касается выбора возврата по указателю или по ссылке, это зависит от того, как выиспользуете возвращаемое значение.Оба могут иметь смысл в разных обстоятельствах.В любом случае, вы хотите вернуть ссылку или указатель на const-объект, а не на const-ссылку или const-указатель:

const SomeObject& GetSomeObject() { ... }
const SomeObject* GetSomeObject() { ... }

Обычно возврат ссылки предпочтительнее.

5 голосов
/ 26 декабря 2010

Запись & const - это бессмысленно . Ссылки всегда постоянны. Опустите ключевое слово const там.

Использование ссылки лучше, если вы хотите вернуть постоянный ненулевой объект. Если вы хотите вернуть либо объект, либо нулевой указатель, используйте вместо него указатель.

См. Также Когда мне следует использовать ссылки и когда я должен использовать указатели?

Используйте ссылки, когда можете, и указатели, когда нужно.

Ссылки обычно предпочтительнее указателей, когда вам не нужно «перезаписывать». Обычно это означает, что ссылки наиболее полезны в открытом интерфейсе класса. Ссылки обычно появляются на коже объекта, а указатели на внутренней стороне.

Исключением из вышеприведенного является случай, когда параметру или возвращаемому значению функции требуется ссылка "страж" - ссылка, которая не ссылается на объект. Обычно это лучше всего сделать путем возврата / взятия указателя и придания указателю NULL этого особого значения (ссылки всегда должны быть псевдонимами объектов, а не разыменованным указателем NULL).

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