【问题标题】:Using a global function inside a class在类中使用全局函数
【发布时间】:2013-12-02 20:22:41
【问题描述】:

我正在尝试自己研究 OOP,我想知道我正在做的事情是正确的还是反模式。在类中使用全局函数可以吗?例如:

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!";
       }
 }

我知道这是一个非常愚蠢的代码,但我只是想解释一下自己。是否表明在类中使用全局函数还是一个坏习惯?我应该使用其他方式还是可以? 谢谢。

【问题讨论】:

  • 除了男性/女性之外,您是否需要考虑其他选项?如果不是布尔值,也可以正常工作。

标签: c++ function class oop global


【解决方案1】:

你可以做到,是的,它不被视为反模式。它通常也是一个优雅的解决方案。 将全局函数包装到命名空间中通常也是一个好主意

【讨论】:

    【解决方案2】:

    在 C++ 中使用全局函数并没有错;该语言是 C 的超集,全局函数是 C 的生计。使用全局函数的一个好处是它不依赖于在调用函数之前实例化的对象。这可以使函数更容易单独测试。

    不过,通常在以这种方式编写代码时,我会将函数放入一个类中并使其成为静态的。这否定了编写与某些标准库函数同名的函数的可能性,因为它位于不同的命名空间中。即:

    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;
    };
    

    【讨论】:

    • “该语言是 C 的超集,而全局函数是 C 的面包和黄油。”我不同意这里隐含的推理,因为这意味着 malloc 也很好,但这个答案的其余部分很好。
    【解决方案3】:

    由于该方法似乎与person类密切相关,因此可以是该类的静态方法。如果您可以想象在不包含 person 类的情况下需要该函数,并决定确实应该将相同的函数用于 person 类对象和其他所有对象,那么在合适的命名空间中使用全局函数 会更好.如果该方法被许多相关的类使用,但似乎不属于任何类,那么这些类和这些辅助函数应该整齐地在同一个命名空间中。

     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!";
           }
     }
    

    【讨论】:

      【解决方案4】:

      你可以做到。是的。并非所有东西都是 C++ 中的对象。

      【讨论】:

        【解决方案5】:

        这没关系(尽管 isMale 需要一个参数)。 ^^ 事实上,只有真正需要访问类表示的函数才应该是成员函数。这样一来,如果您在更改类表示的同时保留其接口,您就不必担心函数了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-20
          • 2011-09-05
          • 2011-01-15
          • 2022-01-16
          相关资源
          最近更新 更多