2013-08-24 72 views
0

我有一个有点大的程序,它使用类A和类的一些功能以及类之外的一些全局函数。然后我有这个类的多个对象,我希望使用另一个函数同时操作。我相信(至少总是被建议)最好在主体之外宣布职能。是否有必要在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; 
} 

而且,在这种情况下,如果它能够更好地刚刚宣布里面主要的功能,然后才让我知道。我只想知道如何实现最好的方法,而不是什么多余的:)

+3

请refor垫子,额外的线或十不会伤害你。这段文字太狭窄了。 – olevegard

+0

@olevegard,对不起。我认为它伤害了眼睛滚动文本,现在我意识到它是愚蠢的。 –

+1

我真的不明白你的问题,所以这可能是完全关闭的,但是:你知道函数可以带参数,对吗? – Mat

回答

4

是以往任何时候都需要声明里面主要的功能?

不,在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(....); 
} 
+0

我完成了这个工作,它运行良好。如果我将A4改为一个类功能,会怎样?在这种情况下,我将不得不使用一个对象来调用它。但我想同时操纵不同的物体,我想知道我该怎么做? –

+0

你的意思是让'A'类的'()静态函数? – billz

+0

哦,好吧,我可以使用任何一个对象作为参数来调用它。我认为它不是一件坏事? –

0

这是一个OOP设计问题。

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

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

+0

我想我的问题不是很清楚。只有一个班。我的问题是关于如何通过不在main中声明我的函数A4来高效地操作对象?我必须特别处理3个对象。每次我只能直接在主要引用它们时,没有比3个参数更好的方法吗? –

+0

论证也是一种参考;如果你想用(any)方法操纵一个对象,你必须给该方法引用该对象。 制作全局方法并不是一个好习惯(除非你用C语言编写) - 即使这样你也可以将它们'隐藏'在单独的头文件中。 您必须让A4以该类别的对象作为参数 A4(someClass objectreference); – RisingSun

+0

如果您的对象是全局定义的,您可以删除参数,只需使用A4()和该方法必须修改对象apple和banana的硬代码,但这不是一个好的编程习惯,并且会在您或其他同事在回顾后更改草莓中苹果的名字。想象一下,在大文件中工作会造成巨大的麻烦。 – RisingSun

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 
} 
+0

够酷。我会遵循后者。不想引入全局变量:) –

0

你可以使用A4()作为一个普通的功能,并通过其指定为类的友元函数使类的成员进行访问的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的声明

相关问题