View previous topic :: View next topic |
Author |
Message |
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Sun Oct 07, 2007 9:09 pm Post subject: |
|
ew pag, ja reiz par to publicismu ierunājies, tad pastāsti, lūdzu, kā ārpus klases nelietotās funkcijas liekot starp privātajām dabū kautko labu, piemēram ātrumu? tas ar linkošanu saistīts? _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Oct 07, 2007 9:25 pm Post subject: |
|
Kādu vēl ātrumu?
Prasti jau klasei liek kautko darīt:
Code: | class Model
{
public:
Model(filename) { ... } // uzkonstruē
void draw() const
{
// te lieto privātos klases atribūtus position un vertices, lai uzzīmētu
}
void update(something x)
{
// te ar lieto privātos klases atribūtus
}
void doSomethingElseWithPosition(float b)
{
position += b; // kautkāda vēl maģija
}
private:
position;
vertices;
}; |
Vienkāršu lielumu dabūšanai ir ok rakstīt getterus:
Code: | class X
{
public:
float getX() const { return _x; }
private:
float _x;
}; |
Taču ar setteru rakstīšanu stilā - void setX(float x) { _x = x; } - nevajag daudz aizrauties, ja vairums klases memberu var uzstādīt ar šādiem setteriem, tad tā nav normāla klase, bet gan atkal struktūra, kura izliekās par klasi, tb atkal nepareiza pieeja.
Taču šad un tad šādi setteri ir vajadzīgi un tos lietot ir ok.
Tipiskais (bet varbūt ne ļoti korektais) piemērs ar klasēm un objektiem - klase ir mašīna, objekts konkrēta mašīnas instance, piemēram kaimiņu Jura jaunais BMW. Tam piemīt visādi parametri un detaļas (motors, riepas, ...) - tie vairumā gadījumu ir privāti atribūti. Taču mašīnai var likt kautko darīt - braukt, bremzēt, griezties, ieslēgt ugunis, utt - tās ir publiskas metodes, kas darbojās ar privātajiem atribūtiem (motors, riteņi, lampas, ...)
Palasi kautko par OOP, ja jau gribi OOP programmēt. |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Sun Oct 07, 2007 9:31 pm Post subject: |
|
a par setteriem.. vai tad kautkā privātajiem mainīgajiem nevar piekļūt ar operatora overloading'u? tādā veidā tad varētu setteri taisīt.. _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Oct 07, 2007 9:38 pm Post subject: |
|
Tak ne jau mana piemēra setteru sintakse ir slikta, bet gan vispār setteru būtība - ka tu ar publiskām metodēm tā vienkārši vari sačakarēt objekta stāvokli. Tieši tāpat kā pārrakstot publiskos memberus. Pilnīgi ne ar ko tas nav labāks.
Tas varbūt tā pārāk vienkārši būs pateikts, bet labs OOP ir tad, ja sabojāt objekta stāvokli no ārpuses nav vienkārši. Ja tas (objekts) ar publiskajām metodēm dara tikai to, kas viņam jādara (ielādē no faila, zīmē sevi, saglabā, un tml).
Privātajiem mainīgajiem tu vari piekļūt no:
1) savas klases jebkuras metodes,
2) jebkā, kas ir definēts kā klases friends,
3) ar maģiskiem tipu-pārveidojošiem pointeru kāstiem, kas balstās uz memberu izvietojumu atmiņā. Taču tādu kāstošanu nekad nekad nekad nevajag lietot!
Operatoru overloadingam ar to nav nekāda sakara. Operatori ir parastas klases metodes, tikai definētas nedaudz citādākā sintaksē. |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Sun Oct 07, 2007 9:51 pm Post subject: |
|
zinu, biju nedaudz apskatījis vektora klasi... kā tur ar tiem operatoriem..
hmm, kāpēc tad tā var sačakarēt objekta stāvokli? nesaprotu, ne to, kā tas iespējams, un varbūt pat arī to, ko tieši tu ar to domā?
vispār es agrāk centos pašķirot objektus pa public un private, vienkārši tagad to nedarīju.. _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Oct 07, 2007 10:24 pm Post subject: |
|
Nesaprotu tavus jautājumus. Kas ir ar vektora klasi un operatoriem?
Objekta stāvokli var vienkāši sačakarēt. Idomājies tevi ir klase C, kas satur sevī kautkādus objektus X (dinamiskā masīvā arrX), un to skaitu count:
Code: | class C
{
public:
int count;
X* arrX;
... // kautas cits
}; |
Tā kā abi ir publiski memberi tu tos vari vienkārši no ārpuses mainīt. Nu un tagad iedomājies, kas notiks, ja tu no ārpuses pieskaitīsi pie count skaitli 5 (jo, piemēram, gribi palielināt objektu X skaitu), bet aizmirsīsi pamainīt dinamisko masīvu arrX? Atbilde ir, loģiski, ka programmas krašs kautkur vēlāk, kur tā izmantos masīvu arrX un skaitu count.
Šis ir tikai piemērs, objekta sačakarēšanai obligāti nav jānotiek ar masīviem. Bieži vien ir vairāki klases atribūti, kas ir atkarīgi savā ziņā viens no otra. Un neuzmanīgi operējot ar tiem no ārpuses var viegli visu sabojāt (un cilvēks ir neuzmanīga būtne - viņa dabā IR ielaist kļūdas).
Tāpēc vajag enkapsulēt objekta datus. Vajag tos padarī privātus, lai neviens no ārpuses tos nevar aiztikt. Lai tikai pati klase savās metodēs operē ar privātajiem datiem. Jo tā "zin", kurš atribūts ir atkarīgs no kura, tāpēc tai ir "mazākas" iespējas kautko sabojāt. private tikai palīdz rakstīt kvalitatīvāku kodu un mazāk ielaist kļūdas - tās vienkārši paziņojot jau kompilēšanas laikā pirms tu vēl vari palaist programmu.
Eh.. stāstu OOP pamatus. Paņem atrodi kādu grāmatiņu un palasi. Vienalga ko par OOP. Tur viss šis ir. Nav manos spēkos caur forumu kādam iemācīt OOP. |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Sun Oct 07, 2007 10:51 pm Post subject: |
|
nu ok, skaidrs, kā klasēs nevajag čakarēt objektus! _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Oct 07, 2007 10:58 pm Post subject: |
|
Nav jau runa par speciālu čakarēšana. Sakot čakarēšana, es biju domājis, kā netīša datu sabojāšana. Netīša = bugs. Tapēc tavā teikumā "nevajag" izklausās dīvaini. Neviens jau speciāli netaisīs bugus.
Un ko nozīmē "klasēs"?? |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Sun Oct 07, 2007 11:02 pm Post subject: |
|
nu es tā arī domāju - nevajag kodā (klasēs) pieļaut šādas kļūdas (viss uz public), lai nesačakarētu to klasi! _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Oct 07, 2007 11:10 pm Post subject: |
|
Klasi tu nevari sačakarēt :) Tu vari sabojāt tikai objektu. Objekts ir klases instance.
Ja tu kaimiņu Jura mašīnai izsit stiklu, tu taču nesabojā vispārīgi jekburu mašīnu (klasi), tu sabojā konkrētu instanci - objektu (kaimiņu Jura BMW). |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Sun Oct 07, 2007 11:13 pm Post subject: |
|
hmm... aizdomīgi... kāpēc tieši kaimiņu Juris un BMW...
anyway, spēlēs tas izskatītos smieklīgi, ja vienai mašīnai izšauj stiklu, vairs nevienai nav :D
bet tagad varbūt, lūdzu, pabeidz savu izteikto domu http://dev.gamez.lv/viewtopic.php?t=1430&start=45 te?
jautājums bija šāds: kurš mērījums tad pierādīs, ka externālie calli ir vainīgi?
gaidu atbildi!
vnk man to slow-down'u vajag precīzi atrast! vajag maksimālu performanci! _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Mon Oct 08, 2007 12:49 am Post subject: |
|
Neesi pareizi saprastis par manu domu. Tu laikam neatšķir klasi no objekta. Izlasi kautkur pamatus par OOP. |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Mon Oct 08, 2007 3:16 pm Post subject: |
|
nē, nē visu sapratu, klase:
class Klase
{
private:
int ccc;
public:
Klase(int cc);
~Klase();
};
objekts:
Klase k;
vai
Klase* k;
k = new Klase;
vai
std::vector<Klase> k;
visuu zinuu _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
DeRatizators
Joined: 27 Apr 2006 Posts: 492
|
Posted: Mon Oct 08, 2007 5:53 pm Post subject: |
|
snake5 wrote: | nē, nē visu sapratu, klase:
class Klase
{
private:
int ccc;
public:
Klase(int cc);
~Klase();
};
objekts:
Klase k;
vai
Klase* k;
k = new Klase;
vai
std::vector<Klase> k;
visuu zinuu |
Ja zini, tad pasaki 4 vai 6 vārdos, ar ko atškiras klase no objekta. _________________ Any PANCAKE has to be long and thin and short and fat. Not to mention being an excellent insulator and a superb conductor. |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Mon Oct 08, 2007 5:57 pm Post subject: |
|
klase ir objekta paraugs, pēc kura tad arī var veidot tādus objektus _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
|