是否有必要在main中声明函数

Is it ever necessary to declare a function inside main?

本文关键字:声明 函数 main 是否      更新时间:2023-10-16

我有一个很大的程序,它使用类a和该类的一些函数以及该类之外的一些全局函数。然后我有这个类的多个对象,我希望使用另一个函数同时处理这些对象。我相信(至少一直有人建议)最好在main之外声明函数。

但是,如果我在main之外声明,似乎没有一种合适的方法可以调用我的对象,因为它们的范围仅限于main,我不想将每个对象作为不同的参数传递,因为这会使事情变得复杂。我相信如果我只是把我的函数放在main里面,我就不会遇到这些问题。

有更优雅的方法吗?

如果我的问题不清楚,这里有一个代码大纲:

class A
{
  void A1();
  void A2();
  void A3();
} //class functions that modify class objects
void A4(); //global function(cant call apple elegantly if placed here)
int main() {
  A apple;
  A banana; //class ojects
  A4(); //gotta modify objects apple and banana by calling A1,A2,A3
        // on them depending on the user input
  return 0;
}

此外,在这种情况下,如果只在main中声明函数更好,请告诉我。我只想知道如何实现最佳方法,而不是任何多余的方法:)

有必要在main中声明函数吗?

没有。在C++11中,lambda将胜过任何其他局部函数。

我想修改3个类对象,所以每次调用函数时只有3个额外的参数(这将是递归的)。我真的不明白为什么不直接说出来。那样做有什么害处?

您正在创建一个依赖于全局变量或捕获到函数中的变量的函数。函数A4()想要修改任何变量,只需将其作为变量传入并多次调用A4()即可操作N次。

void A4(A& a); // A4 can operate on any objects of A type
int main() {
  A apple;
  A banana; //class objects
  A4(apple);  // A4 can operate on any objects of A type
  A4(banana);
  A4(....);   
}

您可以将苹果和香蕉设置为全局,这样A4就可以访问它们。

class A
{
public:
    void A1();
    void A2();
    void A3();
} //class functions that modify class objects

A apple;
A banana; //class ojects
void A4(); //global function
int main() {
    A4(); //gotta modify objects. But want to place this function outside main
    return 0;
}
void A4()
{
    // do some stuff with apple and banana
}

但我更喜欢避免全局变量,只让A4通过引用来获取应该被操纵的对象

类似:

void A4(A& a)
{
    // do some stuff with a
}

这是一个OOP设计问题。

如果所有类都应该具有相同的方法。您应该创建一个具有该方法的超类。然后从该类继承,生成另一个类。这样,所有的类都有一个共同的方法,并且只需要编写一次实现;-)

事实上,拥有一个全局方法是丑陋的,并且违背OOP原则。尽管也有人会争论OOP方法。

您可以将A4()用作普通函数,并通过将其指定为A类的友元函数,使类A的成员可由A4()访问

    class A{
     friend void A4 ( A & );
     public:
           void A1(){...}
           void A2(){...}
    };
    void A4 ( A& );
    void A4(A &apple)
    {
      apple.A1();
      apple.A2();
      ....
    }
    int main()
    {
       A apple;
       A4(apple);
       return 0;
     }

请注意A类中的声明

    friend void A4(A &);

只是一个访问规范,而不是函数A4 的声明