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

时间:2013-08-24 10:19:45

标签: c++ function

我有一个有点大的程序,它使用类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中声明函数,那么请告诉我。我只是想知道如何实现最佳方法而不是多余的方法:)

4 个答案:

答案 0 :(得分:4)

  

是否有必要在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(....);   
}

答案 1 :(得分:1)

你可以让苹果和香蕉变得全球化,这样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
}

答案 2 :(得分:0)

这是一个OOP设计问题。

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

事实上,拥有一个全局方法是丑陋的,并且违反了OOP原则。虽然也可以争论OOP方法。

答案 3 :(得分:0)

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

    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的声明