2017-03-14 5 views
0

私はメニュー駆動型のプログラムを持っており、メニュー機能にはたくさんのパラメータが必要です。メニュー機能を他の機能から呼び出せるようにするためには、すべての機能にこれらの機能が必要です。彼らはそれを必要としない場合や、より良い方法がある場合でも多くの議論?スイッチは、メニュー1と同じパラメータを持つ他の関数を呼び出しています。コードは次のとおりです。パラメータとグローバル変数、メニュープログラム

void menu(int *sklad, int *Max, int *Vrh, int *sklad2, int *Rep, int *Glava){ 

    int izbira; 

    cout << "Sklad - izbira:" << endl; 
    cout << "1) Vnos podatka" << endl; 
    cout << "2) Branje podatka" << endl; 
    cout << "3) Izpis celotnega sklada" << endl << endl; 
    cout << "Krozna vrsta - izbirta:" << endl; 
    cout << "4) Vnos podatka" << endl; 
    cout << "5) Branje podatka" << endl; 
    cout << "6) Izpis vrste od glave do repa" << endl << endl; 
    cout << "7) Konec" << endl << endl; 
    cout << "Izbira: "; 

    cin >> izbira; 
    if(!cin){ 
     cout << "Vnesite celo stevilo" << endl; 
     menu(sklad, Max, Vrh, sklad2, Rep, Glava); 
    } 

    switch(izbira){ 
    case 1: { 
     vnosPodatka(sklad, Max, Vrh, sklad2, Rep, Glava); 
     break; 
    } 

    case 2: { 
     branjePodatka(sklad, Max, Vrh, sklad2, Rep, Glava); 
     break; 
    } 

    case 3: { 
     izpisSklada(sklad, Max, Vrh, sklad2, Rep, Glava); 
     break; 
    } 

    case 4:{ 
     vnosPodatka2(sklad, Max, Vrh, sklad2, Rep, Glava); 
     break; 
    } 

    case 5: { 
     branjePodatka2(sklad, Max, Vrh, sklad2, Rep, Glava); 
     break; 
    } 

    case 6: { 
     izpisSklada2(sklad, Max, Vrh, sklad2, Rep, Glava); 
     break; 
    } 

    case 7: { 
     break; 
    } 

    default: { 
     cout << "napaka" << endl; 
     menu(sklad, Max, Vrh, sklad2, Rep, Glava); 
    } 
    } 
} 
+0

メニュー機能の一部のパラメータにデフォルトの引数を設定できます。 –

+0

実際には、各関数がこれらのパラメータを変更するので、デフォルトに設定されていれば、他の関数は基本的にuselesです。 –

+0

ループを繰り返さないでください。 – molbdnilo

答えて

1

キャプチャを使用したラムダがここに役立ちます。パラメータとしてポインタを参照するので、私はデフォルトを提案していませんでした。これは、データのアドレスであると仮定します。 ボイドメニュー(int * sklad、int * Max、int * Vrh、int * sklad2、int * Rep、int * Glava);

auto fixedMenu = [&fixedSklad, &fixedMax, &fixedVhr, &fixedsklad2, &fixedRep](int * Glava) { menu(fixed...., Glava); }); 

fixedMenu(&gLava); 

あなたはそれがあなたの都合の良い時に別の関数を作成し、必要な数の固定パラメータで、このようなラムダを行うことができます。

内部で変更できない場合はnullptrconstにできない場合は、メニュー機能のパラメータの参照を使用することもお勧めします。

0

C++はオブジェクト指向プログラムなので、Menuクラスを作成することをお勧めします。これをシングルトンにすることで、プログラムの他の部分で変更することができます。


Menu.h

class Menu { 
     Menu(int *_sklad, int *_Max, int *_Vrh, 
      int *_sklad2, int *_Rep, int *_Glava) 
      : sklad(_sklad), Max(_Max), Vrh(_Vrh), 
      sklad2(_sklad2), Rep(_Rep), Glava(_Glava) {} 
public: 
    int* sklad; 
    int* Max; 
    int* Vrh; 
    int* sklad2; 
    int* Rep; 
    int* Glava; 

    static Menu& sharedInstance(); 
    void run(); 
}; 

Menu.cpp


#include <Menu.h> 

Menu& sharedInstance() { 
    static Menu instance(<default instanciation>); 
    return instance; 
} 

void Menu::run() 
{ 
    int izbira; 
    cout << "Sklad - izbira:" << endl; 
    cout << "1) Vnos podatka" << endl; 
    cout << "2) Branje podatka" << endl; 
    cout << "3) Izpis celotnega sklada" << endl << endl; 
    cout << "Krozna vrsta - izbirta:" << endl; 
    cout << "4) Vnos podatka" << endl; 
    cout << "5) Branje podatka" << endl; 
    cout << "6) Izpis vrste od glave do repa" << endl << endl; 
    cout << "7) Konec" << endl << endl; 
    cout << "Izbira: "; 

    cin >> izbira; 
    if(!cin){ 
     cout << "Vnesite celo stevilo" << endl; 
     menu(sklad, Max, Vrh, sklad2, Rep, Glava); 
    } 

    switch(izbira){ 
    case 1: { 
    vnosPodatka(sklad, Max, Vrh, sklad2, Rep, Glava); 
    break; 
    } 

    case 2: { 
    branjePodatka(sklad, Max, Vrh, sklad2, Rep, Glava); 
    break; 
    } 

    case 3: { 
     izpisSklada(sklad, Max, Vrh, sklad2, Rep, Glava); 
     break; 
    } 

    case 4:{ 
     vnosPodatka2(sklad, Max, Vrh, sklad2, Rep, Glava); 
     break; 
    } 

    case 5: { 
     branjePodatka2(sklad, Max, Vrh, sklad2, Rep, Glava); 
     break; 
    } 

    case 6: { 
     izpisSklada2(sklad, Max, Vrh, sklad2, Rep, Glava); 
     break; 
    } 

    case 7: { 
     break; 
    } 

    default: { 
     cout << "napaka" << endl; 
     menu(sklad, Max, Vrh, sklad2, Rep, Glava); 
    } 
} 

その後、限り、あなたのインスタンスを変更することができますすべてのコマンドラインを繰り返す必要はありません。

関連する問題