Jednywymiarowa dynamiczna tablica obiektów [SOLVED]

0

Witam,

Napisałem prosty kod, który ma za zadanie dodawać nowe koty (tak, zwierzęta :P). Pojawia się problem przy dodawaniu nowych obiektów. Żadne błędy mi nie wyskakują w code::blocksie, więc nie wiem za co się zabrać. Chodzi o to, że usuwa poprzednio dodane obiekty, a zostawia tylko ostatni.

#include <iostream>
#include <stdlib.h>

using namespace std;

class kot
{
    int wiek;
    int waga;

public:
    void add(int,int);
    void show(int);
};
void kot::add(int age,int weight)
{
    wiek=age;
    waga=weight;
}
void kot::show(int n)
{
    cout<<"wiek "<<n<<" kota: "<<wiek<<endl;
    cout<<"waga "<<n<<" kota: "<<waga<<endl<<endl;
}

int main()
{
    kot* tab;
    int i=0;
    for (;;)
    {
        char k;
        cout<<"1 - dodaj\n2 - wyswietl\n3 - zakoncz"<<endl<<endl;
        cout<<"Wybor: ";
        cin>>k;

        if(k=='1')
        {
            system("cls");
            int age, weight;
            cout<<"Podaj wiek kota [lat]: ";
            cin>>age;
            cout<<"Podaj wage kota [kg]: ";
            cin>>weight;
            cout<<endl;
            tab=new kot[i+3];
            tab[i].add(age,weight);
            i++;
        }
        else if(k=='2')
        {
            int z=0;
            system("cls");
            for(;z<i;z++)
                tab[z].show(z);
        }
        else if(k=='3')
            break;
    }
delete[] tab;

    return 0;
}
 

Dziękuje z góry
Pozdrawiam :)

3
tab=new kot[i+3];
tab[i].add(age,weight);
i++;

i tak za każdym razem.
http://ideone.com/FgdgVa

#include <iostream>
#include <vector>
#include <functional>
#include <iterator>
using namespace std;

struct Cat{ 
	size_t weight, height; 
};

int main() {
	vector<Cat> cats;
	char choice;
	bool quit = false;
	function<void()> actions[] = {
		[&cats]{
			Cat cat;
			cin >> cat.weight >> cat.height;
			cats.push_back(cat);
		},
		[&cats]{
			for(const auto &cat : cats)
				cout << "Weight: " << cat.weight << " "
				     << "Height: " << cat.height << endl;
		},
		[&quit]{
			quit = true;
		}
	};
	while(cin>>choice && !quit){
		auto translatedChoice = choice-'0'-1;
		if(choice > '0' && translatedChoice < distance(begin(actions), end(actions)))
			actions[translatedChoice]();
		else cout << "No action associated to the [" << choice << "] index" << endl;
	}
	return 0;
}
3
if(k=='1')
{
    tab=new kot[i+3];

Za każdym razem jak dodajesz jednego kota tworzysz całą nową tablicę (coraz większą do tego). Jeśli tab wskazywał na jakąś tablicę już wcześniej to rzucasz to w cholerę, czyli wyciek pamięci.

1

W sumie to wiedziałem, że z tym jest problem, natomiast nie wiem jak zastosować 'new' w tym przypadku.

@twonek & @spartanPAGE Czy moglibyście pomóc? :)

EDIT:// Wydaje mi się, że wiem jak to zrobić, natomiast wg mnie to będzie niewykorzystanie dostępnych środków, jakie daje nam c++. Bo mógłbym za każdym razem tworzyc nowa tablice i kopiowac obiekty ze starej tablicy itd itd. Czy jest jakiś inny sposób?

2

Raz na początku wyznacz sobie jakiś stały bufor lub powiększaj go jeśli Ci się skończy - chociaż najbardziej ludzkim rozwiązaniem jest wektor, który zrobi to za Ciebie.

0

Poradziłem sobie m.in dzięki podpowiedzi @spartanPAGE. Wstawiam gotowy kod, jeśli miałby ktoś inny z tym problem.

LINIJKI KODU, KTÓRE BYŁY W TEJ SPRAWIE ISTOTNE:

            ntab=new kot[i+1];
            ntab[i].add(age,weight);
            for(l=0;l<i;l++)
                ntab[l]=stab[l];
            stab=ntab; 

GOTOWY KOD:

#include <iostream>
#include <stdlib.h>

using namespace std;

class kot
{
    int wiek;
    int waga;

public:
    void add(int,int);
    void show(int);
};
void kot::add(int age,int weight)
{
    wiek=age;
    waga=weight;
}
void kot::show(int n)
{
    cout<<"wiek "<<n<<" kota: "<<wiek<<endl;
    cout<<"waga "<<n<<" kota: "<<waga<<endl<<endl;
}

int main()
{

    kot* stab;
    kot* ntab;
    int i=0,l;
    for (;;)
    {
        char k;
        cout<<"1 - dodaj\n2 - wyswietl\n3 - zakoncz"<<endl<<endl;
        cout<<"Wybor: ";
        cin>>k;

        if(k=='1')
        {
            system("cls");
            int age, weight;
            cout<<"Podaj wiek kota [lat]: ";
            cin>>age;
            cout<<"Podaj wage kota [kg]: ";
            cin>>weight;
            cout<<endl;
            ntab=new kot[i+1];
            ntab[i].add(age,weight);
            for(l=0;l<i;l++)
                ntab[l]=stab[l];
            stab=ntab;
            i++;
        }
        else if(k=='2')
        {
            int z=0;
            system("cls");
            for(;z<i;z++)
                ntab[z].show(z);
        }
        else if(k=='3')
            break;
    }
    delete[] ntab;
    delete[] stab;
    return 0;
}
 

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