C ++ getters and setters лучший стиль - PullRequest
2 голосов
/ 26 апреля 2011

в Java-коде простое и очевидное соглашение в этом стиле:

public:
    int GetMyAge(){
        return myAge;
    }
    void SetMyAge(int myAge){
        this->myAge = myAge;
    }
private:
    int myAge;

(я знаю, что это "снова то же самое", , но ) Я прочитал большинство связанных вопросов по SO, и я до сих пор не знаю, "лучший" и "самый официальный" способ сделать это в C ++. Это не может быть просто вопросом предпочтений, может ли ?

EDIT:

Похоже, это может .

Ответы [ 4 ]

11 голосов
/ 26 апреля 2011

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

5 голосов
/ 26 апреля 2011

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

Как этот стиль работает для вас и вашей команды?Считаете ли вы, что это вызывает (или предотвращает) ошибки?Вам легко поддерживать код?Вы не согласны с форматированием?

Ответьте на эти вопросы, и из них возникнет ответ на ваш вопрос.

0 голосов
/ 12 ноября 2012

Простой ответ: имена классов, как правило, заглавные в c ++ (за исключением классов std), методы - в нижнем регистре, некоторые фреймворки, такие как Qt, предпочитают camelCase, однако я предпочитаю underscore_notation - как и STL, см., Например."auto_ptr".

Классы не всегда имеют отдельные файлы .h, потому что здесь файл .java разделен на заголовок .h (для всего пакета) и файлы реализации .cppпо одному на класс.

class TipicalCamelCase {
public:
    /// mark the frequently used small functions inline in the class def.
    inline int getMyAge() const;
    void setMyAge(int myAge=5); // defaults go to the definition.

    /// for efficiently setting more complex things.
    void setMyStuff(const MyStuff& myStuff); 

    /// a tipical class-valued getter 
    /// (sometimes scoffed at since it can have memory leaks 
    /// if you dismiss the class but still use and don't copy MyStuff.)
    const MyStuff& getMyStuff() const; 

    /// a safe getter, but forces copying-out MyStuff.
    MyStuff getMyStuff() const; 

private:
    int myAge;
    static const int zero=0; // allowed only in the new C++11 standard.
    static const int one;
};

Некоторые реализации / инициализации (обычно в отдельном файле TipicalCamelCase.cpp):

const int TipicalCamelCase::one = 1;

int TipicalCamelCase::getMyAge() const{
    return myAge;
}
void TipicalCamelCase::setMyAge(int myAge_){
    myAge = myAge_;
}

Стиль подчеркивания такой же, но

int Tipical_camel_case::get_my_age() const
{
    return my_age;
}

Я предпочитаю это, так как он выглядит чище как в заголовке, так и в файлах реализации.Вы можете видеть, что заголовки функций длиннее, чем в Java.Особенно вы увидите, что для templates (generics) заголовок из 2 строк является типичным, поэтому стоит поместить их немного более разделенными.

template<typename _Tp>
int Class_name::general_function(_Tp);

Я думаю, что это должно быть введением стиля.Если вы используете наследование, для работы в стиле java отметьте все функции, кроме конструкторов virtual, чтобы @overrides работали правильно.

0 голосов
/ 26 апреля 2011

То, что вы написали в приведенном выше коде, является правильным синтаксисом. Если вы ищете правило большого пальца, закодируйте свои функции-аксессоры таким образом, чтобы они были установлены / получили точно значения.

EG:

void SetMyAge(int newAge)
{
    if(newAge > 10 && newAge < 100)
       _age = newAge ;
}

Я бы предпочел поместить валидацию "newAge> 10 && newAge <100" в другую функцию, IsValidAge; даже если код всего одна строка. В долгосрочной перспективе небольшие функции помогают поддерживать код и помогают новым разработчикам лучше понимать код. </p>

void SetMyAge(int newAge)
{
    if(IsValidAge() )
       _age = newAge ;
}

Однако я хотел бы прокомментировать это

void SetMyAge(int myAge){
    this->myAge = myAge;
 }

Хорошей практикой является разграничение именования класса varaiable на _myAge.

EDIT Я думаю, что имя переменной было неправильно понято.

myAge должно называться _myAge.

...