2016-12-03 3 views
2

Ситуация:«Свойства» -подобные методы вместо getters & seters в C++?

class Person { 
public: 
    int& age(); 
    int age() const; 
private: 
    int m_age; 
}; 

Я не знаю, если это работает, как я думаю, поэтому мой первый вопрос заключается в следующем:

  • С помощью этих методов можно создать C#, как «Свойства» ? Я имею в виду:
    • С первого метода можно реализовать то, что должно произойти, когда что-то изменяет значение из m_age.
    • С второй один я могу реализовать то, что должно произойти, когда что-то использует значение из m_age.

Пример:

Person p; 
p.age() = 15; //first method is called? 
std::cout << p.age(); //second method? 

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

Если это чудесно работает, могу ли я использовать это вместо геттеров & сеттеров или это плохое упражнение?

+0

Как бы сеттер работал без параметра? –

+1

@Eli Я думаю, сеттер возвращает m_age по ссылке. –

+0

Использование ссылки, которая была возвращена. Или это работает только, если метод встроен? @TonyJ Да – Tudvari

ответ

2

Да и нет.

Свойства - это синтаксический сахар для скрытия функций. Так да. Вы можете написать функцию, которая возвращает ссылку и получить что-то, что на первый взгляд выглядит как свойство.

Но учтите следующее: за свойством функция setter, которая может (и должна) делать больше, чем просто установить значение. Точка любого сеттера должна гарантировать, что установка значения не наносит вреда состоянию объекта.

Заменив сеттер на функцию, которая возвращает незащищенную ссылку на члена private, вы удаляете эту линию обороны.Вызывающий может использовать эту ссылку по своему усмотрению и возможному ущербу для объекта. Это может быть очень хорошо, в зависимости от характера участника, но вы также можете быть честным. Объявите участника public, улучшите читаемость и избавьте себя от необходимости записывать функцию.

Что касается const части вопроса, вы можете сортировать (и это некрасиво, упрощенно рода «своего рода») считают int& age() как int& age(Person * this) и int age() const в int age(const person * this)

В примере OP в, age() никогда не вызывается с константой Person, поэтому нет причин для вызова int age() const.

3

Ваш код компилирует хорошо и работает как задумано:

#include <iostream> 

class Person { 
public: 
    int& age() { return m_age; } 
    int age() const { return m_age; } 
private: 
    int m_age; 
}; 

int main() { 
    Person p; 
    p.age() = 15; //first method is called? 
    std::cout << p.age(); //second method? 
} 

See Live Demo


Если каким-то чудом это работает, я могу использовать это вместо добытчиками & сеттеры или это плохое упражнение? (курсив мой)

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

void age(int newValue) { 
    if(newValue > 150) { 
     throw std::invalid_argument("You're older than 150? We don't believe that!"); 
    } 
    m_age = newValue; 
}; 
+0

Hah! Ударьте меня на 8 секунд. Научите меня проверять. Немного разные спины, так что я сохраню свой ответ вживую. – user4581301

+0

@ user4581301 Может быть, я больше думаю в коде, чем в прозе: P –

+0

Если бы я мог принять более одного ответа, я бы принял оба, но проза более подробная, поэтому я принял это. Извините и спасибо за помощь! :) – Tudvari

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