我有一个名为Mijloc_transport
的基类和2个名为Masina
和Tramvai
的派生类。我必须做一个菜单类型程序,它可以从派生类创建不同类型的对象并显示它们。我正在使用UPCASTING方法,当我按下1时,if(tasta=="1")
会创建一个对象,我可以看到它正在使用的类型:tabp[0]->show();
。似乎当程序再次进入do循环(使用主标签)时,创建为1的对象将被销毁,我无法看到tabp[0]->show();
,因为该引用已被删除。我该怎么办才能让对象保持活着,这样我才能把它们放进tabp
?
Masina b(30);
p=&b;
tabp[i]=p;
所以稍后我可以显示它们.... 10x为你的帮助
#include "include.hpp"
#include <ctype.h>
#include <cstdlib>
int main(void)
{
int i=0;
Mijloc_transport *tabp[MAX];
Mijloc_transport *p;
int tasta;
main:
do
{
//cout<<"\n\n\n\n\n";
cout<<endl<<"apasa orice tasta pentru a reveni la meniu "<<endl; getch();
system("cls");
cout<<"Tasteaza numarul optiunii dorite din meniu:"<<endl;
cout<<"1. creaza o masina cu 30 cai putere"<<endl; //create an Masina derived Oject
cout<<"2. creaza un tramvai cu 20 de locuri"<<endl;//create an Tramvai derived Oject
cout<<"3. afiseaza memoria"<<endl; //print the objects
cout<<"4. iesire"<<endl;
tasta=cin.get();
}
while(tasta!='1' && tasta!='2'&& tasta!='3'&& tasta!='4');
if(tasta=='1')
{
Masina b(30);
p=&b;
tabp[i]=p;
tabp[0]->show();
cout<<endl<<"apasa orice tasta pentru a reveni la meniu "<<endl;
getch();
//i++; //TREBUIE INCREMENTAT cand ai mai mult de un obiect
goto main;
}
if(tasta=='3')
{
//afiseaza elementele din memorie
//for(int j=0;j<=i;j++) //J<=i
//tabp[j]->show();
tabp[0]->show();
cout<<endl<<"apasa orice tasta pentru a reveni la meniu "<<endl;
getch();
return 1;
}
}
答案 0 :(得分:2)
而不是在堆栈上创建对象,如下所示:
Masina b(30);
你必须动态创建它,如下所示:
Masina *b = new Masina(30);
此外,你应该在循环之外的某个地方声明Masina *b
,这样它会比你在循环中持续的时间更长。
答案 1 :(得分:1)
很难读取您的代码,但根据您的标题,我猜您想使用new
关键字在堆上创建一个对象。这将允许您在堆上创建一个对象(而不是堆栈),它将在函数退出后保持活动状态,请注意您必须清理与new
分配相关的内存。
答案 2 :(得分:1)
tabp[i] = new Masina(30);
但请...每当你使用goto
(特别是这样)时,上帝会杀死一只小猫。
答案 3 :(得分:1)
而不是:
Masina b(30);
p=&b;
tabp[i]=p;
做的:
tabp[i] = new Masina(30);
并且不要忘记:
for ( unsigned int i = 0; i < MAX; ++i )
{
delete tabp[i];
}
当您不再需要tabp(在现有主要之前)时。