2017-12-22 6 views
-4

を働いていない前方宣言が動作していない私の前方宣言コードの例です。C++ - ここ

void Register(); 
void Menu(); 

void Register() 
{ 
string username, password, hospitalname; 
ofstream file; 
file.open("Hospital Creds.txt"); 
cout << "Hospital Name: "; 
cin >> hospitalname; 
cout << "Username: "; 
cin >> username; 
cout << "Password: "; 
cin >> password; 
cout << endl; 

file << hospitalname << endl; 
file << username << endl; 
file << password << endl; 

system("pause"); 
system("cls"); 
Menu(); 
} 

void Menu() 
{ 
int choice; 
cout << " 1. Register Hospital " << endl; 
cout << " 2. Register Donor " << endl; 
cout << " 3. Exit " << endl; 
cout << endl; 
cout << "Please enter a number of your choice: "; 
cin >> choice; 

switch (choice) 
{ 
case 1: 
    system("cls"); 
    Register(); 
    break; 
} 
} 

void main() 
{ 
Menu(); 
} 

プログラムが実行されるときには、選択したときに、それは、その後、)(メニューになり、このようなものですそれはRegister()に行きますが、関数Menu()をコールバックしたいとき、プログラムは終了しました。どうしたの?

+0

これはすべてコードですか? 「選択時」とは何ですか?それが実際にあなたのコードであれば、それはスタックを爆破し、あなたにこれを伝える何らかの形のエラーメッセージを出力する無限再帰です。より多くのコードがある場合は、投稿してください。 –

+1

あなたの問題は前方宣言とは関係ありません。自分自身を呼び出す再帰関数を使用しています。 'Menu()'は、 'Register()'を無限に呼び出す 'Menu()'を呼び出す 'Register()'を呼び出します。これらの呼び出しのいずれかを何らかの形で強制的に(表示していないコードで)強制すると、再帰的に呼び出される関数のそれぞれが返され、 'main()'が返ってプログラムが終了します。また、C++では 'main()'は 'void'ではなく' int'を返します。 – Peter

+0

@ KenY-N編集されました、私のエラーに協力してください、ありがとう –

答えて

3

Menu()Register()から呼び出すと、呼び出しチェーンが決して終了しません。この関数はネストされていますtoo深いです。あなたはすぐにコールスタックを吹き飛ばしています。

実際には、メニューシステムを作成するときに、以前のレベルの関数を関数から呼び出すことはありません。代わりにループを使用してメインメニューを無限に実行するので、関数呼び出しの関係をツリーのように保つことができます。

void Sub1() { 
    // Prompt for input 
    if (option == 0) { 
     return; // End the call tree 
    } 
    else if (option == 1) { 
     Sub11(); 
    } 
    else if (option == 2) { 
     Sub12(); 
    } 
    ... 
} 

int MainMenu() { 
    // Prompt for input 
    if (option == 0) { 
     return 0; // Quit program 
    } 
    else if (option == 1) { 
     Sub1(); 
    } 
    else if (option == 2) { 
     Sub2(); 
    } 
} 
.... 

int main() { 
    while (MainMenu() != 0); 
} 

Here私が書いたサンプルプロジェクトです。どのように私はmain()関数を配置することに注意してください。