Tehtävä:
Alla näet UML-kaavion, joka on osa suurempaa oliosuunnitelmaa. Sinun
tehtävänäsi on toteuttaa kaavion mukainen luokka "Pelaaja". Kuten kuvasta
voidaan nähdä, Joukkue-luokka koostuu pelaajista. Tämä ei kuitenkaan vaikuta
sinun osuuteesi ohjelmiston toteutuksessa - riittää, kun osaat kirjoittaa
luokan UML-kaavion osoittamalla tavalla.
_____________________________ pelaaja _____________________________ -rooli_:string -nimi_:string -pelinro_:int ____________________________ +AsetaNimi(nimi:string):void*________________|Joukkue| +KerroNimi():string +AsetaRooli(rooli:string):void* +Kerr oRooli():string +AsetaNro(nro:int):void* +KerroNro():int _______________________________
Toivottavasti saatte kaaviosta selvää
Ohessa joitakin huomioita, joita tarvitset kaavion tulkinnassa:
* Merkit "-" ja "+" jäsenten edessä määrittelevät jäsenen näkyvyyden. (+ = public, - = private)
* Notaatiossa esitetään ensin jäsenmuuttujan tai parametrin nimi ja tämän
jälkeen tietotyyppi.
* Jäsenfunktioiden paluuarvot näkyvät notaatiossa funktioiden otsikoiden
perässä kaksoispisteellä eroteltuna.
Sain luokan tehtyä. Mitä seuraavaksi pitää tehdä?
class Pelaaja { public: void AsetaNimi(string nimi); string KerroNimi(); void AsetaRooli(string rooli); string KerroRooli(); void AsetaNro(int nro); int KerroNro(); private: string rooli_; string nimi_; int pelinro_; };
Mod. lisäsi/korjasi kooditagit
Seuraavaksi olisi hyvä opetella kooditagien käyttö. No ei vaan siis seuraavaksi teet toteutukset noille metodeille ja testaat niiden toimivuuden.
Itse tulkitsisin kaaviosta, että void* tarkoittaisi tyyppiä void*, joka on siis aivan eri asia kuin void. Tässä ei kuitenkaan ole toiminnallisesti mitään järkeä, joten olet luultavasti tehnyt luokan aivan oikein. Onko asteriskeilla kaaviossa jokin muu merkitys?
Mutta kuten Teuro sanoi, luultavasti sinun kuuluu vielä toteuttaa nuo funktiot.
Tuskimpa tarkoituksena on tehdä tyypitöntä osoitinmetodia, koska tehtävä näyttää olevan aivan olio-ohjelmoinnin alkeita. Ylipäätään tyypitön osoitin on melko harvinainen, kuten korkean tason kielissä tapana onkin.
asteriksella ei ole muuta merkitystä. Mitä toi void* tarkoittaa? Onks nä metodit oikein?
void Pelaaja::AsetaNimi(string nimi)
{
cout << "Nimi: " << nimi_ << "\n";
}
void Pelaaja::AsetaRooli(string rooli)
{
cout << "rooli: " << rooli_ << "\n" ;
}
void Pelaaja::AsetaNro(int nro)
{
cout << "pelinro: " << nro_ << "\n" ;
}
Ben kirjoitti:
asteriksella ei ole muuta merkitystä. Mitä toi void* tarkoittaa? Onks nä metodit oikein?
Tyypitön osoitin pyri välttämään tämän käyttöä, mikäli mahdollista. Toteutukset ei ole lähellekään oikein. Onko muuttujan sijoitus opetettu / oletko ymmärtänyt sen merkityksen oikein? Tarkoitan siis, että noi aseta... metodit on tarkoitettu sijoitusta varten niissä ei ole sinällään tarkoitus tulostaa mitään muuta kuin ehkä tarkistamista varten. Julkaisuversiossa tulostukset tulisi ainakin riisua pois.
Joku esimerkki auttaisi asia.
Ben kirjoitti:
Joku esimerkki auttaisi asia.
Anteeksi nimeämisen rikkominen, mutta ei tuntunut oikein tutulta tuo alaviivan oleminen nimen lopussa. Metodit olen myös tavannut aloittaa pienellä kirjaimella.
void Pelaaja::asetaNimi(std::string nimi){ this->_nimi = nimi; }
void Pelaaja::AsetaNro(std::int nro){ 45: this-> nro_ = nro; 46: Virhe void-määreen käytössä * Muuttuja (tai kenttä) AsetaNro määritelty void-tyyppiseksi. * Tarkista ettet ole unohtanut sulkuja (jäsen)funktion nimen perästä. code.cpp:45: error: variable or field 'AsetaNro' declared void code.cpp:45: error: 'int Pelaaja::AsetaNro' is not a static member of 'class Pelaaja' code.cpp:45: error: expected unqualified-id before 'int' code.cpp:45: error: expected ',' or ';' before '{' token
Virheilmoitus.
Ben kirjoitti:
void Pelaaja::AsetaNro(std::int nro)
Miksi olet määritellyt int luvun std::avaruuteen, sehän on ihan perustietotyyppi.
Jätä seuraava lukematta, jos haluat ratkaista tehtävän itse.
#include <iostream> class Pelaaja{ private: std::string _rooli; std::string _nimi; int _pelinro; public: void asetaNimi(std::string nimi); std::string kerroNimi(); void asetaRooli(std::string rooli); std::string kerroRooli(); void asetaNro(int nro); int kerroNro(); }; void Pelaaja::asetaNimi(std::string nimi){ this->_nimi = nimi; } std::string Pelaaja::kerroNimi(){ return this->_nimi; } void Pelaaja::asetaRooli(std::string rooli){ this->_rooli = rooli; } std::string Pelaaja::kerroRooli(){ return this->_rooli; } void Pelaaja::asetaNro(int nro){ this->_pelinro = nro; } int Pelaaja::kerroNro(){ return this->_pelinro; } int main(){ Pelaaja eka; eka.asetaNimi("Juha"); std::cout << eka.kerroNimi() << std::endl; eka.asetaRooli("Admin"); std::cout << eka.kerroRooli() << std::endl; eka.asetaNro(17); std::cout << eka.kerroNro() << std::endl; return EXIT_SUCCESS; }
Kiitos, kyllä yritän ratkaista itse.
Teuro kirjoitti:
Tuskimpa tarkoituksena on tehdä tyypitöntä osoitinmetodia,
Viestini varsinainen sisältö olikin, onko tuolle *:lle annettu jokin merkitys kaaviossa vai onko se ihan koristeena vain. Loogisesti tuosta voisi kai veikata, että se tarkoittaa, että metodi muuttaa olion tilaa.
Metabolix kirjoitti:
Viestini varsinainen sisältö olikin, onko tuolle *:lle annettu jokin merkitys kaaviossa vai onko se ihan koristeena vain. Loogisesti tuosta voisi kai veikata, että se tarkoittaa, että metodi muuttaa olion tilaa.
Ymmärsin toki pointtisi, joten kommentti oli tarkoitettu lähinnä jatkamaan tuota kirjoittamaasi epäilystä * merkin tarpeellisuudesta tässä yhteydessä. Alkuperäisessä luokkakaaviossa sitä tuskin on ollut, tai muuten kuvauksen tekijälle on sattunut lipsahdus?
Aihe on jo aika vanha, joten et voi enää vastata siihen.