2013-12-02 3 views
1

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

bool isMale(char s) 
{ 
     if(s=='m')return true; 
     else return false; 
} 
class person 
{ 
     string name; char sex; 
     bool collocate() 
     { 
      if(isMale(sex))cout<<"He's a male!"; 
      else cout<<"She's not!"; 
     } 
} 

Я знаю, что это очень глупый код, но я просто пытался объяснить себя. Указывается ли использование глобальной функции внутри класса или это плохая привычка? Должен ли я использовать другие способы или все в порядке? Спасибо.

+0

Нужно ли учитывать другой вариант, чем мужчина/женщина для секса? Если бы не логическое значение, то работа была бы такой же хорошей. – andre

ответ

1

Вы можете это сделать. Да. Не все - объект на C++.

3

Вы можете сделать это, да, и это не считается анти-шаблоном. Это довольно часто является изящным решением. Как правило, рекомендуется объединить ваши глобальные функции в пространство имен

0

Это нормально (хотя isMale нуждается в аргументе). ^^ Фактически, только функции, которые действительно нуждаются в доступе к представлению класса, должны быть функциями-членами. Таким образом, у вас меньше функций, чтобы беспокоиться о том, если вы измените представление класса, сохранив его интерфейс.

2

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

Как правило, при написании кода таким образом я помещал свои функции в класс и делал их статичными. Это отрицает возможность записи функции с тем же именем, что и некоторая стандартная функция библиотеки, поскольку она находится в другом пространстве имен. i.e:

class Person 
{ 
public: 

    static bool isMale(char gender) 
    { 
     return gender == 'm'; 
    } 

    bool collocate() 
    { 
     if(isMale(m_sex)) 
      cout << "He's a male!" << endl; 
     else 
      cout << "She's not!" << endl; 
    } 

private: 

    /// m/f 
    char m_sex; 
    /// Person Name 
    String m_name; 
}; 
+1

«Язык - это надмножество C, а глобальные функции - это хлеб и масло C». Я не согласен с подразумеваемыми рассуждениями здесь, так как это подразумевает, что 'malloc' тоже хорош, но остальная часть этого ответа хороша. –

2

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

class person 
{ 
private: 

     string name; 
     char sex; 

public: 
     static bool isMale(char s) 
     { 
      if(s=='m')return true; 
      else return false; 
     } 

     bool collocate() 
     { 
      if(isMale(sex))cout<<"He's a male!"; 
      else cout<<"She's not!"; 
     } 
} 
Смежные вопросы