Как сохранить объект для последующего использования в другой функции? - PullRequest
1 голос
/ 10 мая 2011

У меня есть базовый класс с именем 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;
    }
}

Ответы [ 4 ]

2 голосов
/ 10 мая 2011

Вместо создания объекта в стеке, например:

Masina b(30);

, вы должны создать его динамически, например:

Masina *b = new Masina(30);

и, более того, вы должны объявить Masina *b где-то за пределами цикла, так что он сохраняется дольше, чем время в цикле.

1 голос
/ 10 мая 2011

Вместо:

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

сделайте:

tabp[i] = new Masina(30);

и не забудьте сделать:

for ( unsigned int i = 0; i < MAX; ++i )
{
    delete tabp[i];
}

Когда вам больше не нужен таб (существующий основной).

1 голос
/ 10 мая 2011
tabp[i] = new Masina(30);

но, пожалуйста ... Каждый раз, когда вы используете goto (особенно так), Бог убивает котенка.

1 голос
/ 10 мая 2011

Трудно прочитать ваш код, но, исходя из вашего заголовка, я предполагаю, что вы хотите создать объект в куче, используя ключевое слово new.Это позволит вам создать объект в куче (в отличие от стека), который останется живым после выхода из функции, имейте в виду, что вы должны очистить память, связанную с выделением new.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...