私は学生で、C++ を学んでいます。昨年私が作成した skul の単純なプロジェクトは、ユーザーフレンドリーにするために、スタックとそれが引き起こすメモリリークを考えずに、ある関数から別の関数への複数の呼び出しを行ったことに気付きました。基本的に、これは学生データベース管理システムであり、1 つの画面に対応する 1 つの関数 (メニュー用の関数、データの追加用の関数、データの変更用の関数など) を作成しました。コードが大きいので一部を貼り付けました。最初に menu() から add1() を呼び出し、次に add1() から menu() を呼び出した方法を観察してください...
`//***************************STUDENT DATABASE***********************************
void add1(){
system("CLS");
char ch;
int i=no;
do{
i++;
cout<<"\nName : ";
cin.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );
getline (cin,s[i].name);
cout<<"\nClass : ";
cin>>s[i].cl;
cout<<"\nRollno : ";
cin>>s[i].rollno;
cout<<"\nMarks in";
s[i].m.avg=0;
for(int j=0;j<maxsb;j++)
{
cout<<"\n"<<subject[j]<<": ";
cin>>s[i].m.s[j];
s[i].m.avg+=(s[i].m.s[j]/maxsb);
}
no=i;
cout<<"\nPress 'n' for next and 'b' to exit : ";
cin>>ch;
cout<<"\n***********************************************************************";
}while(ch=='n');
menu(); //calling menu() again from this function...
}
//*************
void menu(){
system("CLS");
int n,flag=0;
do
{
cout<<"1.ADD DATA\n2.VIEW REPORT\n3.MODIFY DATA\n4.DELETE DATA\n5.SORT DATA\n6.GO BACK TO PREVIOUS MENU\n";
cout<<"PLEASE ENTER YOUR CHOICE(enter corresponding integer): ";
cin>>n;
switch(n)
{ case 2: report();break;
case 1: add1();break;
case 3: modify();break;
case 4: del();break;
case 5: sort();break;
case 6: first();
default:cout<<"PLEASE ENTER A VALID CHOICE";system("CLS");flag=1;
}
}
while(flag==1);
}
//**************
void first()
{
system("CLS");
int n,flag=0;
cout<<"\t\t\tSoftware for Teachers";
cout<<"\n\n1.Student Database\n\n2.Play Game\n\n3.Calculator";
cout<<"\n\nEnter your choice: ";
do{
flag=0;
cin>>n;
switch(n)
{
case 1:{ if(flag2==0)
{ setting();
flag2=1;
}
menu(); }
break;
case 2: game();
break;
// case 3: calculator();
// break;
default: cout<<"\nPlz enter a valid choice \n\n Enter your choice again: ";flag=1;
}
}
while(flag);
}
//******************************************************************************
int main()
{
int temp;
first();
cin>>temp;
}
`
このようなある関数から別の関数へのジャンプと、元に戻らないことは、私のコードで数回行われましたが、スタックを殺すことに気づきました。ある関数から別の関数へ、すべてを単一の関数に結合し、goto を使用してあるブロックから別のブロックにジャンプすることは、あまり良い考えではありません (実際にはもっと悪いことです!!)。だから、私の質問は、このタスクを達成するためのより良い方法はありますか?? (これは、上記のコードで m がやろうとしていること、つまりこのプログラムの使いやすさを意味します)
ありがとう