2015-02-28 3 views
1

Я смотрю учебники на C++ на youtube, и я нахожусь на видео под названием «Использование переменных в классах». В видеоролике он объясняет, что если мы будем делать переменные общедоступными в классах, это плохое программирование. Это будет работать, но это все еще плохое программирование. Программа, которую он написал, состояла из класса с частной переменной, и он использовал две функции для доступа к переменной. Код выглядит следующим образом:Использование переменных в классах (справка на C++)

#include <iostream> 
#include <string> 
using namespace std; 

class MyClass { 
public: 
    void setName(string x) 
    { 
     name = x; 
    } 
    string getName() 
    { 
     return name; 
    } 
private: 
    string name; 


}; 

int main() 
{ 
    MyClass TO; 
    TO.setName("Taylor"); 
    cout << TO.getName(); 
} 

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

+1

Это хорошо продуманный вопрос, но в конце он немного неясен. «Отдельная функция для возврата имени» - это то, что называется «getter». Члены класса обычно являются частными, чтобы обеспечить инкапсуляцию. Так что это может показаться немного избыточным, но так оно и делается. – mjuarez

+0

Вы спрашиваете, почему 'setName' не возвращает' name'?Название вопроса можно было бы улучшить ... – emlai

+0

Да, это то, о чем я прошу. – Tay

ответ

0

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

Если вы просто хотите ввести переменную и распечатать ее, достаточно одной функции.

+0

«Если вы просто хотите ввести переменную и распечатать ее, достаточно одной функции». - * input * и * print *, что мне кажется как две функции, точно так же, как в коде OP. – emlai

0

Объявлять переменные являются частными и использовать публичные функции - это интерфейс для установки и получения переменных - это лучшая практика. Почему не возвращает значение из функции set, является следствием «разделения правила беспокойства». Пожалуйста, прочитайте это, чтобы получить больше информации о нем http://en.wikipedia.org/wiki/Separation_of_concerns

0

функции-члены, которые с префиксом set называются сеттеры и функции-члены, которые с префиксом get называются добытчиками.

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

  • добытчики «получить» (возвращение) переменной внутри класса, в то время как
  • сеттеры «набор» (изменить) переменную внутри класса до некоторой определенной величины.

Для обоснования использования геттеров и сеттеров см. the answers here. Они охватывают множество хороших моментов в том, почему геттеры и сеттеры - это хорошо в объектно-ориентированном программировании.

+0

Он фактически использовал термин setter и getter. Я просто не видел их значимости, но я понимаю это немного больше, посмотрев ссылку, которую вы предоставили. Спасибо. – Tay

0

Потому что иначе вы не смогли бы написать код, чтобы получить имя, если вы также не устанавливаете имя.

Рассматривают пытается написать функцию, чтобы напечатать имя MyClass, переданного в качестве параметра:

void printName(MyClass my_class){ 
    std::cout << my_class.getName() << "\n"; 
} 

Как бы вы написать это с setName функции, но не getName функции?

В вашем тривиальном примере вам не нужен getName, но вам действительно не нужен MyClass. Вы могли бы просто написать:

std::cout << "Taylor\n"; 

но ясно, что это не пункт учебника.

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