2016-05-23 3 views
0

При попытке очистить свой C++, я пытался найти лучший способ создания аксессуаров.Практические советы и рекомендации по связям с C++

Я хочу разъяснить свое понимание и выяснить, правильно ли я делаю. У меня есть несколько вопросов, но они кажутся довольно простыми, поэтому я свернул их все в один вопрос с переполнением стека.

Ниже приведен пример кода, представляющий то, что я думаю, что "правильный способ делать вещи:

class MyClass 
{ 
private: 
    std::string StringMember_; 
    int IntMember_; 

public: 
    MyClass(const std::string &stringInput, const int &intInput) : StringMember_(stringInput), IntMember_(intInput) 
    { 
    } 

    const std::string &StringMember() const 
    { 
     return StringMember_; 
    } 

    void StringMember(const std::string &stringInput) 
    { 
     StringMember_ = stringInput; 
    } 

    const int &IntMember() const 
    { 
     return IntMember_; 
    } 

    void IntMember(const int &intInput) 
    { 
     IntMember_ = intInput; 
    } 
}; 

Мои вопросы:

Где мои аксессоров вернуть const ссылочную переменную а, то есть const std::string , это означает, что он (переменная члена моего класса) не может быть изменен. Это верно?

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

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

Что касается ключевого слова mutable, при каких обстоятельствах я бы действительно хотел использовать это? Я изо всех сил пытался подумать о хорошем сценарии, когда у меня будет метод const, который должен был бы модифицировать членов класса.

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

С чисто синтаксической точки зрения, следует ли писать мои ссылки, такие как const int& intInput или const int &intInput. Действительно ли имеет значение, где амперсанд, или это просто вопрос личных предпочтений?

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

Я использовал это в качестве ссылки: https://isocpp.org/wiki/faq/const-correctness

+0

Почему downvote?Кроме того, я обновил заголовок, чтобы попытаться сделать его более понятным. – Interminable

+0

Я предполагаю, что это потому, что вы задали несколько вопросов. Мы предпочитаем, чтобы вы задали один вопрос на вопрос. Тем не менее, все вопросы, кроме последнего, тривиальны, так что, на мой взгляд, все в порядке. Последний вопрос, однако, слишком широк, и мнение основано на stackoverflow. – user2079303

+0

Я думал, что они слишком тривиальны для отдельных вопросов. Что касается последнего, я в основном пытался выяснить, действительно ли я делал что-то ужасное, что я не идентифицировал. – Interminable

ответ

3

Где мои аксессоры вернуть константную ссылку переменная, т.е. const std :: string, это означает, что она (переменная-член класса) не может быть изменена. Это верно?

Исправить. Переменная не может быть изменена посредством ссылки const.

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

Исправить. Он также позволяет вызывать функцию для объекта const.

Где я перехожу в параметрах метода const, это означает, что я гарантирую, что эти параметры всегда сохраняются при их передаче, тем самым защищая любые исходные переменные, передаваемые в результате изменения тела метода. Правильно ли это?

Исправить. То же самое можно достичь, приняв аргумент по значению.

Что касается ключевого слова mutable, при каких обстоятельствах я бы действительно хотел использовать это?

См When have you used C++ 'mutable' keyword?

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

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

С чисто синтаксической точки зрения, я должен писать свои ссылки, как сопзИте Int & intInput или сопзИте Int & intInput.

Оба синтаксически эквивалентны, и выбор между ними является чисто эстетичным.

И, наконец, что я делаю в примере выше хорошей практики?

Общего ответа нет. Аксессоры иногда полезны. Часто они избыточны. Если вы предоставляете функцию, которая позволяет напрямую установить значение, например, вы здесь, то вы можете также избавиться от аксессуаров и сделать его общедоступным.

+0

Активировано для позиции против аксессуаров. – SergeyA

+0

Отмечено как ответ, поскольку у вас была хорошая трещина в решении всего, что я просил! Я все еще не полностью продан по идее анти-аксессуар (точка отладки была всего лишь примером). Я никогда не использовал их вообще, но иметь возможность контролировать точку доступа для данных членов, кажется мне полезен, потому что в случае необходимости, скажем, добавить проверку для установки значения для данных члена, не иметь доступ у аксессуаров? – Interminable

+1

@ Interminable хорошо, я не могу противостоять аргументам, которые вы еще не дали :) с частным интерфейсом, если ваш дизайн изменяется, и вы позже хотите предотвратить прямое назначение в пользу проверенного подхода, это, вероятно, не проблема изменить видимость, добавить аксессуар и изменить код для его использования. В случае публичного API ваш аргумент действителен. – user2079303

0

Кажется мне, что у вас есть очень хорошая ручка на понятиях здесь. Что касается примера mutable, то есть один из них: у вас есть метод поиска, и по соображениям производительности вы кэшируете последние результаты поиска ... этот внутренний кеш должен быть изменен для метода поиска const. То есть внешнее поведение не изменилось, но внутренне что-то могло измениться.

0

Вот некоторые примеры mutable:

memoiziation кэша, потому что когда-то referencially прозрачное, но дорого вычислить, первый вызов (сопзИте-квалифицированный) аксессора вычисляет значение и сохраняет его в хеш-файле изменяемого элемента таблицы, второй и последующие вызовы вместо этого выбирают значение из таблицы .

счетчики доступа, синхронизация, регистраторы и другие приборы, которые нужно изменить какое-то состояние, когда константные квалифицированные аксессоры называются

От https://www.quora.com/When-should-I-actually-use-a-mutable-keyword-in-C++

Смежные вопросы