Neuvoa C :aan ja luokkien välisiin suhteisiin.
Eli jos tehtävänä on tehdä luokat: Opiskelija, Kurssi ja Kurssilleilmoittautuminen eli ajatus että Opiskelija ilmoittautuu Kurssille niin onko kyseessä assosiaatio vai kooste? Itse ajattelin että tuo olisi assosiaatio (Kurssilla on opiskelijoita), mutta kait tuo voi olla koostekin (Kurssi koostuu opiskelijoista).
Ja miten tuollainen toteutetaan erillisen luokan kautta? Olisiko jollakulla hyviä neuvoja tai antaa linkkiä hyvään esimerkkiin.
Eli jos tehtävänä on tehdä luokat: Opiskelija, Kurssi ja Kurssilleilmoittautuminen eli ajatus että Opiskelija ilmoittautuu Kurssille niin onko kyseessä assosiaatio vai kooste? Itse ajattelin että tuo olisi assosiaatio (Kurssilla on opiskelijoita), mutta kait tuo voi olla koostekin (Kurssi koostuu opiskelijoista).
Ja miten tuollainen toteutetaan erillisen luokan kautta? Olisiko jollakulla hyviä neuvoja tai antaa linkkiä hyvään esimerkkiin.
Vastaukset 29
Vanhimmat
Tuon mukaan assosiaatio, mutta ehkäpä sen voisi tehdä myös aggregaationakin, mutta ei missään tapauksessa kompositiona, koska kun se tuhotaan myös sen osat tuhotaan (tässä oppilaat/kurssit):
http://www.visualcase.com/kbase/associations.htm
Käytännössä ei paljon pas*ankaan väliä, koska todellisuudessa olisi kuitenkin tietokantapalvelin, josta kurssit ja opiskelijat haettaisiin sekä ilmoittautumiset hoidettaisiin.
Mutta jos tuo oli koulutehtävä niin kerrotko millainen oli mallivastaus, olisi kiva tietää.
Tuo esimerkki ei ihan ollut sitä mitä kaipasin
Jos ei olisi assosiaatioluokkaa (tehtävvä käsketään tekemään), mutta assosiaatio olisi Kurssin ja Opiskelijan välillä tekisin ihan normaaliin tapaan ilman tuota yhteyssuhdeluokkaa
Nyt tuossa assosiaatioluokassa on erillisiä muuttujia (tosin samaa tietoa sisältäviä muuttujia on myös noissa toisissa luokissa), joten oppikirjankin (C ja olio-ohjelmointi) mukaan pitää tehdä erillinen assosiaatioluokka (yhteyssuhdeluokka). Lisäksi pitää tehdä osoittimet/viittaukset suhteessa oleviin luokkiin.
Mutta mitä sitten? Mitä funktioita tuohon yhteyssuhdeluokkaan (assosiaatioluokkaan) pitää tehdä että tästä saa jotain järkevää aikaiseksi?
Et sunkaan sä vaan ole lukenut Paginan Oliohjelmointia? Se kasvihuone ei varmana ikinä ainakaan säädön puoleen lähtenyt toimimaan. Ihan ufoo atk-juttuu
wtf?
C ja olio-ohjelmointi kirjaassa on esimerkki luvussa 21...Mies ja Nainen ja Avioliitto. Otin esimerkkiin liittyvät souret ja headerit ja tein projektin. Mutta se ei toimi. Herjaa error C2440: '=' : cannot convert from 'const Henkilo *' to 'Henkilo *' (on se hieno kun ei esiemrkit toimi. yritä siinä sitten opsiella.)
tässä siiis Henkilo-luokasta oliot mies ja nainen ja olioilla yhteyssuhdeluokka.
Tuli jotenkin mieleen: itsekin olio-ohjelmointiin tutustuessani törmäsin Paginan tuotantoihin ja aloin pikkuhiljaa ihmetellä, mistä niitä oikein tulee. Niissäkin oli fraseerattu kaikenmaailman hienoilla atk-termeillä, mutta valmista ei tullut mistään.
kirjoita siihen koodiin (Henkilo)
Ei ihan noin, pitää olla (Henkilo*), tai sitten vain ottaa constit pois.
Eikös tuosta assosiaatioluokasta voi ottaa mallia? Laitako ko. luokan koodin tänne, ihan mielenkiinnosta vain että kuinka on tehty.
Varmaan jotain lisää, poista, hae. Kai siinä on vektori johon talletat?
Jep otin nuo const ihan ensiksi pois, niin virheitä on nyt sitäkin enemmän.
Otin tosin tuosta mallia ja tein oman yksinkertaisemman mallin, joka toimii. Nyt sitä pitäisi vaan yrittää kehittää vielä lisää...
Voi ottaa ja otinkin. Nyt on oma toimiva yksinkertainen, jota tosin pitää alkaa kehittää toimimaan enemmän tehtävänkuvauksen mukaiseksi.
Koodia en laita, kun tämä on niin surkea foorumi jakaa koodia.
Ei ole vektoria, eikä tule :)
Tuostahan voi siis tehdä ihan mitä vain mutta aika ja osaaminen rajoitttaa aika lailla.
Pölkkypäät! Sille luokalle pitää määrittää sijoitusoperaattori, joka saa oparametrikseen pointterin. Mutta jos ei halua pelailla pointteilla, kirjoittaa vain: Joku=(Henkilö)JokuOpiskelijaheebo; Joku on tyyppiä Henkilö
Siis joko näin lisäämällä se (Henkilo*):
class Avioliitto
{
Henkilo *mies;
Henkilo *vaimo;
public:
Avioliitto(const Henkilo *, const Henkilo *);
void Nayta();
~Avioliitto();
};
Avioliitto::Avioliitto(const Henkilo *p_mies, const Henkilo *p_vaimo)
{
mies = (Henkilo*)p_mies;
vaimo = (Henkilo*)p_vaimo;
}
int main(int argc, char *argv[])
{
Henkilo nainen("Maija", "Meikäläinen", 1, 3, 70);
Henkilo mies("Tatu", "Teikäläinen", 2, 4, 68);
Avioliitto liitto(&mies, &nainen);
liitto.Nayta();
return 0;
}
Tai näin ottamalla constit poijes:
class Avioliitto
{
Henkilo *mies;
Henkilo *vaimo;
public:
Avioliitto(Henkilo *, Henkilo *);
void Nayta();
~Avioliitto();
};
Avioliitto::Avioliitto(Henkilo *p_mies, Henkilo *p_vaimo)
{
mies = p_mies;
vaimo = p_vaimo;
}
int main(int argc, char *argv[])
{
Henkilo nainen("Maija", "Meikäläinen", 1, 3, 70);
Henkilo mies("Tatu", "Teikäläinen", 2, 4, 68);
Avioliitto liitto(&mies, &nainen);
liitto.Nayta();
return 0;
}
Miten tallennan tällaisesta noiden Opiskelija *p_opiskelija, Kurssi *p_kurssi sisältämät tiedot?
void Ilmoittautuminen::TallennaTiedostoon(Opiskelija *p_opiskelija, Kurssi *p_kurssi)
{
int i=0;
int montako=1;
ofstream tiedKirj("Ilmoittautumiset.txt",ios::binary|ios::app); //out=app
for(i=0;im_opiskelijanimi, sizeof(Opiskelija) );
//tiedKirj.write( (char*) &ilmoittautumiset[i].opiskelija->m_opiskelijanimi, sizeof(Opiskelija) );
tiedKirj.write( (char*) &ilmoittautumiset[i].kurssi, sizeof(Kurssi) );
}
tiedKirj.close();
}
oho, ei ihan copy-paste siirtynytkän oikein... mm. for-loopin ehdot ja { }
mutta siis noide Opiskelija ja Kurssi tyypisten osoittimien sisältämät tiedot...niissä tulee tietoa matkassa, mutta yrittää vaikka mitä niin joko ne ei silti tulostu tiedostoon tai sitten tulee vika herjaa.
Kannattaa enste tulostaa tekstinä, että mekin nähdään, mitä sinne tiedostoon kirjoittuu.
Vissiin menny aika sotkuksi tuo koodi, joten paha sanoa mikä mättää. Koita ensin vaikka ilman tuota for looppia, puuttuuko siitä ; ja näyttäisi olevan ; sen perässä, jolloin ei se oikeasti tee mitään.
Siis tuossa tapahtui copy-pastettaessa tämän paskan foorumisoftan takia jotain outoa. For loopi ja muut on kunnossa mutta en ymmärrä miten olio osoittimesta saadaan tietoa tulostettua?
void Ilmoittautuminen::TallennaTiedostoon(Opiskelija *p_opiskelija, Kurssi *p_kurssi)
{
int i=0;
int montako=1;
ofstream tiedKirj("Ilmoittautumiset.txt",ios::binary|ios::app); //out=app
for(i=0;im_opiskelijanimi, sizeof(Opiskelija) );
tiedKirj.write( (char*) &ilmoittautumiset[i].kurssi, sizeof(Kurssi) );
}
tiedKirj.close();
}
ja vittu taas voi perseensuti että perseestä tämä foorumin softa....
For on siis näin
for i=0 im_opiskelijanimi, sizeof(Opiskelija) );
tiedKirj.write( (char*) &ilmoittautumiset[i].kurssi, sizeof(Kurssi) );
}
ei saaatana, vituilleen taas vaikak yritin muokata noita "erikoismerjkkjä"... Vittu viimeinen kerta siinäpähän saatana on jos ei vittu tämä saatanan vitun persereikä ffoorumisoftaa voi toimia fiksusti.
se for looppi on oikein!
for i=0 im_opiskelijanimi, sizeof(Opiskelija) );
vai
//tiedKirj.write( (char*) &ilmoittautumiset[i].opiskelija, sizeof(Opiskelija) );
void Ilmoittautuminen::TallennaTiedostoon(Opiskelija *p_opiskelija, Kurssi *p_kurssi)
{
int i=0;
int montako=1;
ofstream tiedKirj("Ilmoittautumiset.txt",ios::binary|ios::app); //out=app
for(i=0;im_opiskelijanimi, sizeof(Opiskelija) );
//tiedKirj.write( (char*) &ilmoittautumiset[i].kurssi, sizeof(Kurssi) );
}
tiedKirj.close();
}
for i on 0 i on pienempi kuin montako i plus plus
saatana
tiedKirj.write( (char*) &ilmoittautumiset[i].opiskelija->m_opiskelijanimi, sizeof(Opiskelija) );
tiedKirj.write( (char*) &ilmoittautumiset[i].opiskelija, sizeof(Opiskelija) );
eikä ole puolipistettä perässä ja on kaarisulut. siis for-loopissa.
miten siis Opiskelija tyyppisen opiskelija-olion osoittimesta tietoa ulos....talllennettavaksi tiedostoon?
Siis jotenkin näin se on sulla?
void Ilmoittautuminen::TallennaTiedostoon(Opiskelija *p_opiskelija, Kurssi *p_kurssi)
{
int i=0;
int montako=1;
ofstream tiedKirj("Ilmoittautumiset.txt",ios::binary|ios::app); //out=app
for(i=0;im_opiskelijanimi, sizeof(Opiskelija) );
tiedKirj.write( (char*) &ilmoittautumiset[i].opiskelija, sizeof(Opiskelija) );
tiedKirj.write( (char*) &ilmoittautumiset[i].kurssi, sizeof(Kurssi) );
}
tiedKirj.close();
}
Mitä herjoja tulee?
Toimisiko ihan vain näin?
void Ilmoittautuminen::TallennaTiedostoon(Opiskelija *p_opiskelija, Kurssi *p_kurssi)
{
ofstream tiedKirj("Ilmoittautumiset.txt",ios::binary|ios::app); //out=app
if (tiedKirj.is_open() {
tiedKirj.write( (char*) p_opiskelija, sizeof(*p_opiskelija) );
tiedKirj.write( (char*) p_kurssi, sizeof(*p_kurssi) );
tiedKirj.close();
}
}
Mitään selväkielistä tekstitiedostoa tuolla ios::binary avauslipulla ei tule.
siis sehän on binääritiedosto. Sehän ei silloin ole välttämättä ihan järkevän näköistä. Saan esim. tallennetua luokkien jäsenmuuttujia jne., mutta nyt kun pitäisi assosiaatioon liittyen saada tallennettua noissa opiskelija ja kurssi olevaa tietoa niin ei tallennu mitään. p_opiskelijassa olisi opiskelijan_nimi ja kurssissa kurssin_nimi.
tuolla minun koodilla sinne ei tallennu yhtään mitään eli se on täysin tyhjä.
Muistelisin kokeilleeni mallisi mukaan , mutta pitää kokeilla uudestaan.
Se mitä tallettuu riippuu siitäkin onko ne nimet sielä luokassa määritelty char taulukoiksi jolloin nimet tallettuu, vai osoittimena jolloin tallettuukin pointteri, muistiosoite.
Tuossa koodissani näkyy puuttuvan sulje tiedKirj.is_open() ehdossa.