Логично ли возвращать указатель на символ *, который вы берете в качестве аргумента функции? - PullRequest
2 голосов
/ 20 января 2011

Так, как такая вещь может быть использована для создания таких глупых вложенных функций: Z.reset(...C.reset(B.reset(A.get()))...) чтобы функция могла выглядеть как

    char * reset(char * buffer)
    {
        ... 
                    return buffer;

    }

так что ... мой вопрос - такая вещь приемлема в простом C ++API ты бы показывал людям или нет?

Ответы [ 4 ]

4 голосов
/ 20 января 2011

Мой честный ответ заключается в том, что вы не должны делать это в C ++, потому что вы не должны использовать строки в стиле C в C ++.: -)

Но да, это считается хорошей практикой, потому что это может избежать ненужных потерь неэффективности.См. этот пост Джоэля Спольски на Шлемиэле Художнике для обсуждения, почему это так.

3 голосов
/ 20 января 2011

Это вполне приемлемо, но,

Вы не должны использовать char* в C ++. Вместо этого используйте std::string.

2 голосов
/ 20 января 2011

Технически это разрешено.Строго говоря, это приемлемо.Но я все равно не буду этого делать.

Единственная причина, по которой я могу придумать такую ​​функцию, - это поддержка Method Chaining , что я считаю мерзостью. Мнения по этому вопросу отличаются .Вы можете любить их, думать, что они хорошие и выразительные, хорошо для IntelliSense, что у вас есть.В самом деле, иногда это может даже быть правильным.

Метод цепочки в стороне, я не вижу, что это дает вам то, что вы хотели.На самом деле, я думаю, что это дает вам то, чего вы не хотите: запутанную семантику.Если кто-то просматривает ваш заголовочный файл, он увидит это возвращение и спросит, зачем ему это нужно.Они могут думать, что это что-то не так, как память, которой они должны управлять, или что-то в этом роде.Кто знает.Но семантика не совсем понятна.Так что я бы избежал этого.

1 голос
/ 20 января 2011

Ну, если вы передаете символ * в первую очередь и модифицируете его, я не вижу необходимости его возвращать. Единственный раз, когда я думаю, что char * reset (char * buffer) должен быть подписью, это если вы возвращаете сообщение об ошибке в случае, если что-то случилось, чего не должно быть.

...