Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ luokkaongelma

Legu [07.08.2006 13:22:38]

#

Olen tekemässä pienimuotoista valintanappi-luokkaa.
Alla oleva koodi kääntyy, mutta ei toimi. Miksi näin?
Koodin pitäisi toimia niin, että aluksi määritellään valintanapit ja sitten ryhmä, jonka valinnat vaikuttavat toisiinsa.

class CheckBox {
public:
	bool selected;
	int x, y;
	char * teksti;
	void Piirra();
};

class CheckBoxGroup {
public:
	void AddBox(CheckBox Boxi);
	CheckBox CheckBoxes[10];
	void Update();
private:
	int Used;
};

void CheckBoxGroup::AddBox(CheckBox boxi) {
	CheckBoxes[Used] = boxi;
	Used++;
	return;
}

void CheckBoxGroup::Update() {
	for (int i = 0; i < Used; i++) {
		if (OsuukoHiiri(CheckBoxes[i].x, CheckBoxes[i].y, Hiiri.x, Hiiri.y, 31, 31)) {
			if (Hiiri.hiiri & SDL_BUTTON(1) && !Hiiri.pohjassa) {
				CheckBoxes[i].selected = true;
				Hiiri.pohjassa = true;
			}
		}
	}
}

// MÄÄRITELLÄÄN

CheckBox Boksi1;
CheckBox Boksi2;

CheckBoxGroup TesiBoksit;

//Alustetaan tms.

PeliModeGroup.AddBox(AgainstBot);
PeliModeGroup.AddBox(AgainstClock);

//looppiin

PeliModeGroup.Update();

Niin, ja tässä on siis vain osa koodista

Metabolix [07.08.2006 13:31:57]

#

Ryhmässä haluat varmaankin käsitellä niitä osoittimina. Jos annat parametrina luokan, siitä luodaan funktiota varten uusi samanlainen kopio. Jotta funktiossa käsiteltäisiin oikeasti samaa oliota, sinne pitää lähettää osoitin tai viittaus. Suosittelen noin yleisestikin tutustumista osoittimiin.

Olisi kovin ystävällistä aina kertoa myös, millä tavalla koodi ei toimi.

Legu [07.08.2006 14:07:45]

#

Tätä arvelinkin, mutta C++ ei ole minulle vielä niin tuttu. Koitin katsoa osottimia ja viittauksia Hassunhauskasta c++ oppaasta mutta asia ei valjennut minulle sitä kautta.

Koodi ei siis vain tee mitään.

Eli lähinnä haluasin tietää miten nuo osoittimen ja viittaukset tuossa tapauksessa laitettaisiin.

Metabolix [07.08.2006 14:48:41]

#

class CheckBoxGroup {
  //... osoittimia laatikoihin
  // vector-systeemillä saisi vielä tuon niin, ettei se rajoitu kymmeneen.
  CheckBox * CheckBoxes[10];
  // ja osoitinten kanssa siis CheckBoxes[i]->x, eli pisteen paikalle nuoli

  // Mikään ei myöskään takaa, että Used olisi alussa nolla. Siksipä kannattaa tehdä tuolle luokalle luojafunktio, jota kutsutaan automaattisesti, kun uusi yksilö luodaan.
  CheckBoxGroup();

  //... osoitin laatikkoon
  void AddBox(CheckBox *boxi);
}
// se luojafunktio
CheckBoxGroup::CheckBoxGroup()
: Used(0) // Used on alussa nolla.
{
  // Täällä voisi sitten kaikkea tehdä, mutta mitäpä sitä turhia...
}

Group.AddBox(&Uusi_Hieno_Laatikko); // &-merkki tekee osoittimen

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta