2013-08-24 5 views
0

У меня есть несколько большая программа, которая использует класс A и некоторые функции класса и некоторые глобальные функции вне класса. Тогда у меня есть несколько объектов класса, которые я хочу манипулировать одновременно с помощью другой функции. Я считаю (по крайней мере, всегда было рекомендовано), что лучше всего объявлять функции за пределами основного.Нужно ли вообще объявлять функцию внутри 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; 
} 

Кроме того, в таких случаях, если его лучше просто объявить функцию внутри главного, то просто дайте мне знать. Я просто хочу знать, как реализовать лучший метод, а не что-то избыточное :)

+3

Пожалуйста refor мат, дополнительная линия или десять не повредят вам. Этот текст слишком тесно связан. – olevegard

+0

@olevegard, Извините. Я подумал, что мне больно прокручивать текст, теперь я понимаю, что это было глупо. –

+1

Я действительно не понимаю ваш вопрос, так что это может быть полностью отключено, но: вы знаете, что функции могут принимать аргументы, не так ли? – Mat

ответ

4

ли когда-либо необходимо, чтобы объявить функцию внутри основной?

No. И в C++ 11 лямбда будет бить любую другую локальную функцию.

Я хочу изменить 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

Я закончил реализацию этого, и он работает хорошо. Что делать, если я вместо А4 выполнял функцию класса. В этом случае мне придется называть его одним объектом. Но я хочу, чтобы одновременно манипулировать разными объектами, мне было интересно, как я могу это сделать? –

+0

Вы хотите сделать 'A4()' статической функцией класса 'A'? – billz

+0

Ну ладно, я могу назвать это с помощью какого-либо одного объекта со всеми объектами в качестве аргументов. Полагаю, это не плохо? –

0

Это проблема проектирования ООП.

Если все классы должны иметь тот же метод. Вы должны сделать суперкласс, имея этот метод. А затем наследуйте этот класс, создавая другой класс. Таким образом, все классы имеют один общий метод, и вам нужно только один раз написать реализацию ;-)

Действительно, глобальный метод является уродливым и основан на принципах ООП. Хотя можно спорить и с методами ООП.

+0

Я полагаю, мой вопрос не ясен. Существует только один класс. Мой вопрос в том, как эффективно манипулировать объектами, не объявляя мою функцию A4 внутри main? Я должен манипулировать 3 объектами в частности. Не лучше, чем 3 аргумента каждый раз, когда я могу просто ссылаться на них непосредственно в главном? –

+0

Аргумент - это своего рода ссылка; Если вы хотите манипулировать объектом с помощью (любого) метода, вы должны указать ссылку на этот объект на метод. Неправильно использовать глобальные методы (если вы не кодируете на C) - и даже тогда вы будете скрывать их в отдельных файлах заголовков. Вы должны будете позволить A4 взять объект этого класса в качестве аргумента A4 (someClass objectreference); – RisingSun

+0

Если ваши объекты определены глобально, вы можете отказаться от аргументов и просто использовать A4() и жесткий код, который этот метод должен изменить для объекта apple и banana, однако это не очень хорошая практика программирования и даст вам проблемы, когда вы или другие коллеги меняют название яблока в клубнике после обзора. Представьте, что это приносит огромные проблемы при работе в больших файлах. – RisingSun

1

Вы можете сделать яблоко и банан глобальными, таким образом, А4 сможет получить к ним доступ.

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

Прохладный достаточно. Я последую за последним. Не хочу вводить globals :) –

0

вы можете использовать A4() в качестве обычной функции и сделать член класса А доступный А4(), указав его в качестве друга функции класса А

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

обратите внимание, что утверждение в классе А

friend void A4(A &); 

только спецификация доступа не декларация функции A4

Смежные вопросы