2014-01-31 6 views
0

Я хочу объявить некоторые свойства класса. Я думаю о создании частных переменных для свойств, которые я хочу в классе.Объявление свойства C++ по ссылке или указателю

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

Итак, какой путь лучше с помощью ссылки или указателя, как показано в примере ниже?

class ExampleClass 
{ 

    private: 
    int age; 

    public: 
    //This function allows access via reference 
    int& GetAgeByReference() 
     { 
     int& refAge= age; 
     return refAge; 
     } 
    //This function allows access via pointer 
    int* GetAgeByPointer() 
     { 
     int* pointAge= &age; 
     return pointAge; 
     } 


} 
+0

@KerrekSB: Спасибо, что поймал ошибку. Я написал это в спешке. – techfun

+3

Если вы предоставляете полный доступ через своих аксессуаров, почему бы просто не сделать это общедоступной переменной? – HeywoodFloyd

+0

Вы понимаете, что, возвращая неконстантную ссылку, вы фактически нарушаете принцип скрытия данных? Это кажется действительно запутанным дизайном. –

ответ

3

Возвращение по ссылке по двум причинам:

  1. Возвращаясь по указателю бы предположить, что nullptr можно вернуть (но это не будет). Ссылка не может быть нулевой, поэтому пользователь знает, что они всегда получат действительный объект (при условии, что он хорошо себя ведет).
  2. Возвращаясь указателем, пользователь этой функции задается вопросом о праве собственности на объект, на который указывает. Ссылка указывает пользователю, что они могут делать то, что им нравится с этим объектом, и им не нужно заниматься каким-либо управлением памятью.

Должно ли быть утечкой внутренних объектов вашего объекта, как это совсем другое дело.

5

Лучше сделать ни:

public: 
    int GetAge() { return age; } 
    void SetAge(int age) { this->age = age; } 

Таким образом, вы можете добавить проверки вменяемости, как возраст не является отрицательным, и изменить базовую реализацию без изменения всех пользователей класса.

0

Просто используйте методы получения и установки.

Get: Должен быть постоянный метод и возвращать const ref // const int & GetAgeByReference() const {};
Set: Возьмите const реф и вернуть void or bool по мере необходимости. // void SetAgeByReference(const int &)

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