如何保持一个对象以供以后在另一个函数中使用?

时间:2011-05-10 12:51:08

标签: c++ object

我有一个名为Mijloc_transport的基类和2个名为MasinaTramvai的派生类。我必须做一个菜单类型程序,它可以从派生类创建不同类型的对象并显示它们。我正在使用UPCAST​​ING方法,当我按下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;
    }
}

4 个答案:

答案 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(在现有主要之前)时。