lista - c++ problem

0

Jestem w trakcie pisania projektu na progr obiektowe. Zatrzymałem się w pewnym punkcie mianowicie. Mam 2 funkcje, jedna tworzy obiekt danej klasy dynamicznie i wrzuca go do listy obiektów. Druga funkcja ma po kolei wyświetlać dodane uprzednio obiekty, sęk w tym że jak wyjdę z while wszystkie dane przepadają. Wrzucam mój kod, po kompilacji zrozumiecie o co mi chodzi. Co zrobić aby obiekty zamieszczone raz w liście były widoczne zawsze i wszędzie aż do zakończenia pracy programu lub wywołania funkcji list.clear().

#include <iostream>
#include <string>
#include <list>
#include <fstream>
#include <cstddef>
using namespace std;


//CLASSES
class A
{
public:
string drugi, name;
A(string nazwa, string nazwisko): drugi(nazwisko), name(nazwa){}

protected:


private:
};
class B : public A
{
public:

B(string drugi, string name,  string imie): A(drugi,name), pierwszy(imie){}
protected:
string pierwszy;
private:

};
class C : public A
{
public:

protected:

private:

};
class D : public B          // LIŚĆ
{
public:

 D(string pierwszy, string drugi, string name, int wiek): B(pierwszy, drugi, name), trzeci(wiek){}
 friend void showobjD(list<D> listD, string &a, string &b, string &c, int &d);
 friend void makeobjD(list<D> listD, string &a, string &b, string &c, int &d);
protected:

private:
int trzeci;
};
class E : public B
{
public:

protected:

private:

};
class F : public C
{
public:

protected:

private:

};
class G : public C
{
public:

protected:

private:

};
class H: public E, public F     //LIŚĆ
{
public:

protected:

private:

};
class I : public F
{
public:

protected:

private:

};
class J : public G
{
public:

protected:

private:

};
class K : public G       // LIŚĆ
{
public:

protected:

private:

};
class L : public I      // LIŚĆ
{
public:

protected:

private:

};
class M : public I          // LIŚĆ
{
public:

protected:

private:

};
class N : public J              // LIŚĆ
{
public:

protected:

private:

};
void makeobjD(list<D> listD, string &a, string &b, string &c, int &d)
{
    //list<D> listD;
    //string a,b,c;
    //int d;
    bool next=true;
    char p;
    cout << "A - Dodaj obiekt: " << endl << " Q - Wyjdz. " << endl << " B - Wyswietl. " << " C - wyczysc. " << endl;
    while(next)
    {
        cin >> p;
        switch(p &0x5F)
        {
        case 'A':
            {
                cout << " Nazwa obiektu: (string)" << endl;
             cin >> a;
                cout << " Pierwsze pole: (string)" << endl;
             cin >> b;
                cout << " Drugie pole: (string)" << endl;
             cin >> c;
                cout << " Trzecie pole: (int)" << endl;
             cin >> d;
                D* obiekt = new D(a, b, c, d);
                    listD.push_back(*obiekt);
                    cout << "A - Dodaj kolejny: " << endl;
            }
            break;
            case 'B':
            {
                cout << " dzialam " << endl;

                for(list<D>::iterator iter=listD.begin(); iter != listD.end(); ++iter)
                    {
                        cout << iter->pierwszy << " " << iter->drugi << " " << iter->name << " " << iter->trzeci << endl;
                    }
            }
            case 'C':
            {
                listD.clear();
            }
            break;
        case 'Q': next=false;
        break;
        }
    }
}

void showobjD(list<D> listD, string &a, string &b, string &c, int &d)
{
    cout << " dzialam " << endl;
    for(list<D>::iterator iter=listD.begin(); iter != listD.end(); ++iter)
    {
    cout << iter->pierwszy << " " << iter->drugi << " " << iter->name << " " << iter->trzeci << endl;
    }
    cout << " tak " << endl;
}




//FUNKCJE
void draw_hierarhy(){
	cout<<"       A"<<endl;
	cout<<"   "<<(char)218<<(char)196<<(char)196<<(char)196<<(char)193<<(char)196<<(char)196<<(char)196<<(char)191<<endl;
	cout<<"   B       C"<<endl;
	cout<<" "<<(char)218<<(char)196<<(char)193<<(char)196<<(char)191<<"   "<<(char)218<<(char)196<<(char)193<<(char)196<<(char)196<<(char)196<<(char)191<<endl;
	cout<<" D   E   F     G"<<endl;
	cout<<"     "<<(char)192<<(char)196<<(char)191<<" "<<(char)179<<"   "<<(char)218<<(char)196<<(char)193<<(char)196<<(char)191<<endl;
	cout<<"       H"<<(char)196<<(char)180<<"   "<<(char)179<<"   "<<(char)179<<endl;
	cout<<"         I   J   K"<<endl;
	cout<<"       "<<(char)218<<(char)196<<(char)193<<(char)196<<(char)191<<" "<<(char)179<<endl;
	cout<<"       L   M N"<<endl;

}

//MAIN
int main()
{
    string a,b,c;
    int d;
    list<D> listD;
char w, m;
bool next=true, ext=true;
		while(next)
    {
        cout << "C - Zmiana wezla w strukturze. " << endl;   //CD
        cout << "M - Stworz obiekt. " << endl;               //MO
        cout << "D - Usun obiekt. " << endl;                  //DO
        cout << "O - Zmodyfikuj obiekt. " << endl;           //MDO
        cout << "I - Wyswietl informacje(nazwy) obiektow z danego poziomu. " << endl; //DIR
        cout << "S - Szczegolowe informacje o obiekcie. " << endl;     //SHOW
        cout << "E - Zapisz zbior do pliku. " << endl;    //SAVE
        cout << "A - Odczyt zbioru z pliku. " << endl;    //READ
        cout << "T - Wyswietl hierarchie. " << endl;      //TREE
        cout << "Q - Zamknij program. " << endl;          //QUIT
        cin>>w;
	switch(w &0x5F)
        {
	case 'C': //cd
        break;

        case 'M':
        {
            while(ext)
            {
                cout << " Do ktorej klasy dodac obiekt? " << endl << " D || H || L || M || N || K " << endl;
                cout << " Q - Wyjdz z tej opcji. " << endl;
                cin >> m;
                switch(m &0x5F)
                {
                   case 'D':
                   {
                       makeobjD(listD, a, b, c, d);
                   }
                   break;
                   case 'Q':
                   ext = false;
                   break;
                }
            }
        }
            break;

            case 'D':  //do
                break;

                case 'O': //mdo
                    break;

                    case 'I':

 showobjD(listD, a, b, c, d);

                    break;
                        case 'S': //show
                            break;

                            case 'E':  //save
                                break;

                                case 'A':  //read
                                    break;

                                    case 'T':  //tree
                                    draw_hierarhy();
                                        break;
                                        case 'Q':  //quit
                                            next=false;
                                                break;
        }
    }

	return 0;
}
 
0

To jest masakra co się tu dzieje.
Dane przepadają, bo ich nigdzie nie przechowujesz. Zawsze zwracaj wskaźnik na korzeń, wtedy będziesz miał odnośnik do trzonu.
Nie mam zielonego pojęcia co to są za klasy, bo ich nazwy totalnie nic nie mówią. Rzeczywiście potrzebujesz ich AŻ tyle?

0

Tak, potrzebuje ich tyle, taka hierarchia gdzie A jest korzeniem, obiekty mam dodawać tylko do liści. Jak zwracać wskaźnik na korzeń?

1 użytkowników online, w tym zalogowanych: 0, gości: 1