Incomprensioni con std array<array<T>> pushback

di il
2 risposte

Incomprensioni con std array<array<T>> pushback

Buonasera.
Ho un array bidimensionale classico di oggetti "Casella". Ogni oggetto contiene una sua lista dinamica di Oggetti "Animale".
Quando aggiungo un "Animale" con .push_back() la lista rimane vuota.
Ho prodotto un codice di esempio:

////////////////////////////FILE.h
#include <array>
#include <vector>

class Animale
{
	int varS;
public:
	Animale(int s);
	~Animale();
};

class Casella{
	std::vector<Animale> AnimaliVivi;
public:
	int QuantiAnim();
	void AddAnimale(Animale a);
	Casella();
	~Casella();
};
	
class Mondo
	{
		
		static std::array<std::array<Casella, 60>, 60> Mondo::MaMa;
	public:
		Mondo();
		static Casella Mondo::GetCasella(int x, int y);
		~Mondo();
	};
	
////////////////////////////FILE.cpp

#include "Cond.h"

Animale::Animale(int s)
{
	varS = s;
}
Animale::~Animale()
{
}
Casella::Casella()
{
}
Casella::~Casella()
{
}
Mondo::Mondo()
{
}
Mondo::~Mondo()
{
}
std::array<std::array<Casella, 60>, 60> Mondo::MaMa;
Casella Mondo::GetCasella(int x, int y) { return MaMa[x][y]; }
void Casella::AddAnimale(Animale a) { AnimaliVivi.push_back(a); }
int Casella::QuantiAnim() { return AnimaliVivi.size(); }

////////////////////////////MAIN.cpp 

private: System::Void load(System::Object^  sender, System::EventArgs^  e) {
		Animale cavia(3);
		Casella();
		Mondo();
		Mondo::GetCasella(0, 0).AddAnimale(cavia);
		Mondo::GetCasella(0, 0).AddAnimale(cavia);
		label1->Text = Convert::ToString(Mondo::GetCasella(0, 0).QuantiAnim());
		}

Dove sbaglio?
Sarà che quando alloca la memoria per le "Casella" non ne riserva per la lista di "Animali" essendo in quel momento vuota?
Grazie!

2 Risposte

  • Re: Incomprensioni con std array<array<T>> pushback

    Intanto: che dovrebbero significare Casella() e Mondo() così come le hai scritte nel metodo Load()?
    Il problema vero è che GetCasella restituisce una Casella per valore mentre dovrebbe restituire Casella per reference
    Se lo restituisci per valore, non vai a modificare l'oggetto contenuto nel doppio std::array, ma agisci su una copia che poi va persa.
  • Re: Incomprensioni con std array<array<T>> pushback

    Accidenti è vero, grazie! Con un puntatore di ritorno funziona a dovere. E ha senso.

    Nel codice da cui ho estrapolato l'esempio usavo i costruttori Casella() e Mondo() per assegnare dei valori a dei membri statici, senza dover creare un oggetto specifico, e li ho lasciati lì per non saper nè leggere nè scrivere!
Devi accedere o registrarti per scrivere nel forum
2 risposte