如何使对象保持活动状态以供以后在另一个函数中使用

How to keep alive an object for later use in another function?

本文关键字:另一个 函数 对象 何使 活动状态      更新时间:2023-10-16

我有一个名为Mijloc_transport的基类和两个名为MasinaTramvai的派生类。我必须做一个菜单类型程序,该程序可以从派生类中创建不同类型的对象并显示它们。我正在使用UPCAST方法,当我按1时,if(tasta=="1")会创建一个对象,我可以看到它使用的类型:tabp[0]->show();。似乎当程序再次进入 do 循环(使用主标签)时,创建为 1 的对象被销毁,我看不到tabp[0]->show();,因为引用被删除了。我该怎么做才能让这些物体保持活力,以便将它们放入tabp

Masina b(30);
p=&b;
tabp[i]=p;

所以以后我可以显示它们....10倍为您提供帮助

#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<<"nnnnn";
        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;
    }
}

而不是在堆栈上创建对象,如下所示:

Masina b(30);

您必须动态创建它,如下所示:

Masina *b = new Masina(30);

此外,您应该在循环外的某个地方声明Masina *b,以便它比您在循环中的时间持续更长时间。

而不是:

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 时(在现有 main 之前)。

很难阅读您的代码,但根据您的标题,我猜您想使用 new 关键字在堆上创建一个对象。这将允许您在堆(而不是堆栈)上创建一个对象,该对象将在函数退出后保持活动状态,请注意您必须清理与分配new相关的内存。

tabp[i] = new Masina(30);

但请...每次你使用goto(尤其是像这样)上帝都会杀死一只小猫。