În C ++ nu pot înțelege indicii și clase

Sunt proaspăt din colegiu și am lucrat în C ++ de ceva timp. Înțeleg toate elementele de bază ale C ++ și le folosesc, dar am dificultăți în abordarea unor teme mai avansate, cum ar fi indicii și clase. Am citit câteva cărți și tutoriale și înțeleg exemplele din ele, dar atunci când mă uit la câteva exemple de viață reală avansată nu le pot da seama. Acest lucru ma ucide pentru ca ma simt ca ma impiedica sa-mi aduc programul C ++ la urmatorul nivel. A mai avut cineva această problemă? Dacă da, cum ai reușit? Știe cineva despre cărți sau tutoriale care descriu cu adevărat indicii și concepte de clasă? sau poate un exemplu de cod cu comentarii descriptive bune folosind indicii avansați și tehnici de clasă? orice ajutor ar fi foarte apreciat.

0
FYI, indicii și clase SUNT elementele de bază ale C ++.
adăugat autor Wedge, sursa
P.S. C ++ este un limbaj foarte bogat și larg. Dacă nu înțelegeți exemple avansate care nu înseamnă neapărat că vă lipsesc ceva (gaura "avansată" C ++ de iepure merge foarte, foarte adânc). Va ajuta dacă ați furnizat mai multe informații specifice.
adăugat autor Wedge, sursa
Permiteți-mi să ghicesc - scrieți un cod de matematică computațională, iar lipsa dvs. de înțelegere a indicatorilor se opune prelucrării datelor multidimensionale. Închide?
adăugat autor Arkadiy, sursa
Multe răspunsuri au fost foarte bune. Multe mulțumiri tuturor celor care au răspuns. Voi urma câteva răspunsuri, dar se pare că trebuie doar să rămân cu ea și să câștig mai multă experiență.
adăugat autor timmyg, sursa
Am încercat să clarific în întrebarea mea, dar poate că nu am făcut-o, că înțeleg indicii și clase în ceea ce privește lecțiile și exemplele de manuale. Dar când am nevoie să citesc și să înțeleg codul altcuiva, de exemplu un API software, cu indicii și clase este acolo unde am probleme cu înțelegerea.
adăugat autor timmyg, sursa
Cum lucrați cu C ++ pentru o vreme, fără aceste cunoștințe ...? C ++ w/o clase suna ca C, iar C w/o indicii suna ca um .....
adăugat autor Aardvark, sursa
Nu cunoașteți un lins de C ++ dacă nu înțelegeți conceptul de clase. Și dacă nu înțelegeți indicii, atunci probabil că nici nu știți C ... Sistemul educațional eșuează
adăugat autor FlySwat, sursa
Din curiozitate, ce limbi ați învățat în timpul colegiului? În afară de limbile funcționale pure, nu mă pot gândi la nici o limbă care nu are indicii sau clase.
adăugat autor David Locke, sursa

27 răspunsuri

Pentru a înțelege mai bine indicatorii, cred că ar putea fi util să te uiți la modul în care limbajul de asamblare funcționează cu indicii. Conceptul de pointeri este într-adevăr una dintre părțile fundamentale ale limbajului de asamblare și ale arhitecturii de instruire a procesorului x86. Poate că vă va lăsa să cădeți ca indicii sunt o parte naturală a unui program.

În ceea ce privește clasele, în afară de paradigma OO, cred că ar fi interesant să privim clasele dintr-o perspectivă binară de nivel scăzut. Ele nu sunt atât de complexe în acest sens la nivel de bază.

You may read Inside the C++ Object Model if you want to get a better understanding of what is underneath C++ object model.

0
adăugat

Puteți găsi acest articol de Joel instructiv. Ca o parte, dacă ați "lucrat în C ++ de ceva timp" și ați absolvit CS, ați fi mers la un JavaSchool (aș susține că nu ați lucrat în C ++ deloc; lucrează în C, dar folosind compilatorul C ++).

De asemenea, doar pentru al doilea răspuns la hojou și nsanders, pointerii sunt foarte fundamentali pentru C ++. Dacă nu înțelegeți indicii, atunci nu înțelegeți elementele de bază ale C ++ (recunoscând faptul că acest lucru este începutul înțelegerii C ++, apropo). În mod similar, dacă nu înțelegeți clasele, atunci nu înțelegeți elementele de bază ale C ++ (sau OO pentru asta).

Pentru indicatori, cred că desenarea cu cutii este o idee bună, dar lucrul în asamblare este, de asemenea, o idee bună. Orice instrucțiuni care utilizează adresarea relativă vă vor ajuta să înțelegeți ce indicii sunt destul de repede, cred.

În ceea ce privește clasele (și programarea orientată pe obiecte mai general), aș recomanda Stroustrups "The C ++ Programming Language" ultima ediție. Nu numai că este materialul de referință canonic C ++, dar are și un pic de material pe multe alte lucruri, de la ierarhiile de clasă orientate pe obiect și moștenire până la principiile de proiectare în sistemele mari. Este o citire foarte bună (dacă nu puțin groasă și tersă în spoturi).

0
adăugat
lol, tocmai am citit articolul lui Joel și asta ma făcut să vin aici și să caut întrebări despre indicii.
adăugat autor Spidey, sursa

Aflați limba de asamblare și apoi învățați C. Apoi veți ști ce sunt principiile fundamentale ale mașinii (și indicatorii).

Indicatorii și clasele sunt aspecte fundamentale ale C ++. Dacă nu le înțelegeți, înseamnă că nu înțelegeți cu adevărat C ++.

Personal am reținut C ++ timp de mai mulți ani până am simțit că am avut o înțelegere fermă a lui C și ce se întâmpla sub capota în limba de asamblare. Deși acest lucru a fost cu mult timp în urmă, cred că mi-a profitat cu adevărat cariera pentru a înțelege cum funcționează calculatorul la un nivel scăzut.

Învățarea pentru program poate dura mulți ani, dar ar trebui să rămâi cu ea pentru că este o carieră foarte plină de satisfacții.

0
adăugat

De la răspunsul lui lassevek la o întrebare similară despre SO :

este un concept care pentru mulți   poate fi confuz la început, în   în special când vine vorba de copiere   pointer valori în jurul și încă   referindu-se la același bloc de memorie.

     

Am descoperit că este cea mai bună analogie   ia în considerare indicatorul ca o bucată de   hârtie cu o adresă de casă pe ea, și   blocul de memorie pe care îl numește   casa actuală. Tot felul de operațiuni   poate fi ușor explicat:

     
      
  • Copiați valoarea indicatorului, scrieți doar adresa pe o nouă hârtie
  •   
  • Liste legate, o bucată de hârtie la casă cu adresa următorului   casa pe ea
  •   
  • Eliberarea memoriei, demolarea casei și ștergerea adresei
  •   
  • Pierderi de memorie, pierdeți bucata de hârtie și nu puteți găsi casa
  •   
  • Eliberând memoria, dar menținând o referință (acum invalidă), dați drumul   casa, ștergeți una din bucățile de   dar aveți o altă bucată de hârtie   cu adresa veche pe el, când tu   du-te la adresa, nu veți găsi a   casa, dar ați putea găsi ceva   care seamănă cu ruinele unuia
  •   
  • Depășirea tamponului, mutați mai multe lucruri în casă decât puteți   eventual se potrivesc, deversând în   casa vecinilor
  •   
0
adăugat

Indicatorii și clasele sunt subiecte complet diferite, așa că nu le-aș putea strânge împreună. Dintre cele două, aș spune că indicii sunt mai fundamentali.

Un bun exercițiu pentru a afla ce indicatori sunt:

  1. creați o listă conectată
  2. iterați prin acesta de la început până la sfârșit
  3. inversează-o astfel încât capul să fie acum spatele, iar spatele este capul

Faceți totul pe o tablă pe primul loc. Dacă puteți face acest lucru cu ușurință, nu ar trebui să aveți probleme în a înțelege ce indicatori sunt.

0
adăugat

Tocmai discutam cateva aspecte legate de C ++ si OO la masa de pranz, cineva (un mare inginer de fapt) spunea ca daca nu ai un fundal de programare cu adevarat puternic inainte sa inveti C ++, te va ruina literalmente.

Vă recomand să învățați mai întâi o altă limbă, apoi să treceți la C ++ atunci când aveți nevoie de ea. Nu e ca și cum ar fi ceva mare despre pointeri, ele sunt pur și simplu o piesă vestigică rămasă de atunci când a fost dificil pentru un compilator să transforme operațiunile în asamblare eficient fără ele.

Aceste zile, dacă un compilator nu poate optimiza o operațiune de matrice mai bine atunci puteți utiliza indicii, compilatorul dvs. este rupt.

Nu mă înțelegeți greșit, nu spun că C ++ este oribil sau nu și nu vreau să încep o discuție de advocacy, am folosit-o și o folosesc ocazional acum, doar vă recomand să începeți cu altceva .

Nu este deloc cum să învățați să conduceți o mașină manuală, apoi să o puteți aplica cu ușurință unei mașini automate, este mai mult să învățați să conduceți pe una dintre aceste macarale de construcție uriașe, atunci presupunând că se va aplica atunci când începeți să conduceți o mașină - atunci vă că vă conduceți mașina în mijlocul străzii la 5mph cu luminile de urgență activate.

[edit] revizuirea ultimului paragraf - cred că ar fi putut fi cea mai exactă analogie a mea vreodată!

0
adăugat
toate limbile pe care le sugerați să le înveți mai întâi? ar fi o alegere bună? In prezent incerc sa invat PHP cat si c ++, in sintaxa inteleasa ca sunt destul de asemanatoare.
adăugat autor timmyg, sursa
Oh, și dacă vrei cu adevărat să înveți conceptul de sângerare, te uiți la Scala. Sincer, asta ar putea fi cel mai bun din cauza tuturor conceptelor pe care le expuneți imediat. Hascal și Lisp sunt, de asemenea, cunoscute pentru predarea unor concepte de programare bune.
adăugat autor Bill K, sursa
C # și Java sunt bune, deoarece sunt verificate în timp util și sincer că este un obicei foarte bun pentru a intra. Dacă vrei să te păcălești, Python e bun. Dacă faci un site web, ruby on Rails - perioadă.
adăugat autor Bill K, sursa

Am folosit pentru a avea o problemă să înțeleagă indicii în pascal mod înapoi :) Odată ce am început să fac pointers asamblare a fost într-adevăr singura modalitate de a accesa memoria și doar ma lovit. S-ar putea suna ca o lovitură îndepărtată, dar încercarea de asamblare (care este întotdeauna o idee bună să încercați să înțelegeți ce computere este într-adevăr) probabil vă va învăța pointeri. Clase - bine nu înțeleg problema dvs. - a fost școala dvs. programare structurată pură? O clasă este doar o modalitate logică de a privi modelele vieții reale - încercați să rezolvați o problemă care poate fi rezumată într-un număr de obiecte/clase.

0
adăugat

Pentru indicatori:

Am găsit acest post care a avut o discuție foarte atentă despre indicatori. Poate că ar ajuta. Sunteți familar cu refrences, cum ar fi în C #? Acesta este ceva care se referă la altceva? Acesta este probabil un început bun pentru înțelegerea indicatorilor.

De asemenea, uitați-vă la postul lui Kent Fredric de mai jos într-o altă modalitate de a vă prezenta la pointeri.

0
adăugat

Pentru clase:

Momentul de spargere pentru mine a fost când am aflat despre interfețe. Ideea abstractizării detaliilor despre modul în care ați scris rezolvă o problemă și oferind doar o listă de metode care interacționează cu clasa a fost foarte vizibilă.

De fapt, profesorul meu ne-a spus în mod explicit că ne-ar clasifica programele prin conectarea claselor noastre la hamul de testare. Clasificarea ar fi făcută pe baza cerințelor pe care ni le-a dat și dacă programul sa prăbușit.

O scurtă poveste scurtă, clasele vă permit să încheiați funcționalitatea și să o numiți într-un mod mai curat (de cele mai multe ori, există întotdeauna excepții)

0
adăugat
Un ham de testare este un cod care exersează un alt set de cod. Profesorul meu a avut în principiu un program principal care a numit funcții în clasa noastră. Va executa testul, va marca un grad, va șterge dosarul și va introduce următorul fișier al studenților în soluția sa și va repeta întregul proces.
adăugat autor Jason Z, sursa
ceea ce este un "ham" de testare?
adăugat autor DarenW, sursa

Pretindeți că un pointer este o adresă de matrice.

x = 500;//memory address for hello;
MEMORY[x] = "hello"; 
print  MEMORY[x]; 

o suprasimplificare grafică, dar, în cea mai mare parte, atâta timp cât niciodată nu vrei să știi ce este acel număr sau dacă îl stabilești manual, ar trebui să fii bine.

Înapoi când am înțeles C Am avut câteva macro-uri pe care le aveam care îmi permiteau mai mult sau mai puțin să folosești indicii la fel cum ar fi fost un indice de matrice în memorie. Dar am pierdut de mult acest cod și de mult uitat.

Îmi amintesc că a început cu asta

#define MEMORY 0; 
#define MEMORYADDRESS( a ) *a;

și că de la sine este greu de util. Sperăm că altcineva se poate extinde pe această logică.

0
adăugat
Da, nu înțeleg, cred că este o modalitate excelentă de a înțelege indicii. Arrays sunt mai ușor de înțeles decât indicii, IMO, deci cred că este un excelent punct de plecare ..
adăugat autor Doug T., sursa
Cred că este un exercițiu foarte util. Heck într-o mulțime de sisteme încorporate nu am avut un pointer la lucrurile alocate pentru mine, am avut un indice matrice :).
adăugat autor Doug T., sursa
pentru cei dintre voi care mi-au bătut pentru acest post, funcționează. Am folosit-o, am ajutat pe alții cu asta. Faptul că sistemul de operare abstractează totul pentru dvs. nu are importanță pentru exercițiu.
adăugat autor Kent Fredric, sursa

To understand pointers, I can't recommend the K&R book highly enough.

0
adăugat

Ai citit limbajul de programare C ++ ? A creat C ++.

C ++ FAQ Lite este, de asemenea, bun.

0
adăugat

Punctul la care am avut cu adevărat indicii era codarea lui TurboPascal pe un FatMac (în jur de 1984 sau cam asa ceva) - care era în acel moment limba nativă Mac.

Mac-ul avea un model de memorie ciudat, prin care atunci când a fost alocată adresa, memoria era stocată într-un pointer de pe morman, dar locația acesteia însăși nu era garantată, iar rutinele de gestionare a memoriei au returnat un pointer la pointer - . În consecință, pentru a accesa orice parte a memoriei alocate, a fost necesară dereferența mânerului de două ori. A durat ceva timp, dar practica constantă a condus lecția acasă.

Pastilele de manipulare ale lui Pascal sunt mai ușor de înțeles decât C ++, unde sintaxa nu îi ajută pe începători. Dacă sunteți cu adevărat blocați indicii de înțelegere în C, atunci cea mai bună opțiune ar putea fi să obțineți o copie aa Pascal compilator și să încercați să scrieți niște cod pointer de bază în ea (Pascal este destul de aproape de C veți obține elementele de bază în câteva ore ). Listele asociate și altele asemănătoare ar fi o alegere bună. Odată ce vă simțiți confortabil cu cei care se întorc la C ++ și cu conceptele stăpânite, veți descoperi că stânca nu va arăta atât de abruptă.

0
adăugat

Indicatorii deja par a fi abordați (fără nici un cuvânt de intenție) în alte răspunsuri.

Clasele sunt fundamentale pentru OO. Am avut probleme enorme care mi-au atras capul în OO - cum ar fi, zece ani de încercări eșuate. Cartea care ma ajutat în final a fost Craig Larman "Aplicarea UML și modele". Știu că sună ca și cum ar fi vorba despre ceva diferit, dar într-adevăr o treabă bună vă ușurează în lumea claselor și a obiectelor.

0
adăugat

This link has a video describing how pointers work, with claymation. Informative, and easy to digest.

This page has some good information on the basic of classes.

0
adăugat
Orice lucru cu argilă devine +1 în cartea mea.
adăugat autor Aardvark, sursa

Cea mai bună carte pe care am citit-o despre aceste subiecte este Gândirea în C ++ de Bruce Eckel. Puteți descărca gratuit aici .

0
adăugat
mulțumită cărții descărcate vine cu o mulțime de exemple
adăugat autor timmyg, sursa

Clasele sunt relativ ușor de înțeles; POO vă poate lua mulți ani. Personal, nu am reușit să înțeleg pe deplin adevăratul POR până anul trecut. Este prea rău faptul că Smalltalk nu este la fel de răspândită în colegii așa cum ar trebui să fie. Aceasta conduce cu adevărat acasă punctul în care OOP se referă la obiectele de tranzacționare a mesajelor, în loc de clase fiind variabile globale autonome cu funcții.

Dacă sunteți cu adevărat noi la ore, atunci conceptul poate dura ceva timp pentru a înțelege. Când i-am întâlnit pentru prima oară în clasa a 10-a, nu am reușit până nu am avut pe cineva care știa ce fac ei prin cod și să explice ce se întâmplă. Asta sugerăm să încercați.

0
adăugat

Într-un sens, poți considera "indicii" drept unul dintre cele două tipuri cele mai fundamentale în software - cealaltă fiind "valori" (sau "date") - care există într-un bloc imens de locații de memorie unice adresabile. Gandeste-te la asta. Obiectele și structurile etc. nu există în memorie, ci doar valori și indicatori. De fapt, un indicator este și o valoare ... valoarea unei adrese de memorie, care la rândul ei conține o altă valoare .... și așa mai departe.

So, in C/C++, when you declare an "int" (intA), you are defining a 32bit chunk of memory that contains a value - a number. If you then declare an "int pointer" (intB), you are defining a 32bit chunk of memory that contains the address of an int. I can assign the latter to point to the former by stating "intB = &intA", and now the 32bits of memory defined as intB, contains an address corresponding to intA's location in memory.

Când "dereference" indicatorul intB, vă uitați la adresa stocată în memoria lui intB, găsiți acea locație și apoi uitați-vă la valoarea stocată acolo (un număr).

Commonly, I have encountered confusion when people lose track of exactly what it is they're dealing with as they use the "&", "*" and "->" operators - is it an address, a value or what? You just need to keep focused on the fact that memory addresses are simply locations, and that values are the binary information stored there.

0
adăugat

Indicatorii și clasele nu sunt subiecte foarte avansate în C ++. Ele sunt destul de fundamentale.

Pentru mine, indicii s-au solidificat când am început să desenez cutii cu săgeți. Desenați o cutie pentru un int. Și int * este acum o cutie separată cu o săgeată îndreptată spre caseta int.

Asa de:

int foo = 3;          //integer
int* bar = &foo;      //assigns the address of foo to my pointer bar

Cu cutia pointerului meu (bara) am posibilitatea fie sa privesc adresa din interiorul casetei. (Care este adresa de memorie a foo). Sau pot manipula orice am o adresă. Manipularea înseamnă că urmăresc acea săgeată către întreg (foo).

*bar = 5; //asterix means "dereference" (follow the arrow), foo is now 5
bar = 0;  //I just changed the address that bar points to

Clasele sunt în întregime un alt subiect. Sunt câteva cărți cu privire la designul orientat pe obiecte, dar nu știu pe cele bune pentru începătorii din vârful capului meu. S-ar putea să ai noroc cu o carte de intro Java.

0
adăugat
ei bine sunt subiecte avansate pentru mine, haha, am înțeles exemplele tale aici, dar atunci când încerc să înțeleg codul altcuiva nu-mi dau seama ... poate că am nevoie doar de mai multă experiență ... mulțumesc pentru răspuns.
adăugat autor timmyg, sursa
Am pe secunda asta. Pentru începători, întotdeauna ALWAYS traduce "pointer" la "address" și "dereference" la "travel-to-address", la fel ca și conducerea unei mașini. pointer-to-pointers devin puncte de expediere PO-boxes - adrese care, atunci când mergeți acolo, găsiți o altă adresă în loc de o locație de stocare.
adăugat autor Aaron, sursa
S-ar putea ca majoritatea acestui cod să nu fie prea bine scris. Odată am petrecut o perioadă semnificativă de timp încercând să aflu cum funcționa un anumit cod pointer greu. Am renunțat și l-am întrebat pe un superior. Se uită la el timp de 2 secunde și spuse: "Asta va cauza un accident. Experiența: Abilitatea de a privi un specimen, de a vedea că face ceva bizar și de a gândi "Este ceva în neregulă cu acest lucru", mai degrabă decât "Există ceva în neregulă cu mine".
adăugat autor deworde, sursa

Înțelegerea indicatorilor în C/C ++

Înainte de a putea înțelege cum funcționează pointerii, este necesar să înțelegem cum sunt stocate și accesate variabilele în programe. Fiecare variabilă are 2 părți - (1) adresa de memorie unde sunt stocate datele și (2) valoarea datelor stocate.

Adresa de memorie este adesea menționată ca lvalue a unei variabile, iar valoarea datelor stocate este denumită rvalue (l și r semnificând stânga și dreapta).

Luați în considerare declarația:

int x = 10;

Pe plan intern, programul asociază o adresă de memorie cu variabila x. În acest caz, să presupunem că programul atribuie x să locuiască la adresa 1001 (nu este o adresă realistă, ci este aleasă pentru simplitate). Prin urmare, lvalue (adresa de memorie) a lui x este 1001, iar valoarea rvalue (data) a lui x este de 10.

The rvalue is accessed by simply using the variable “x”. In order to access the lvalue, the “address of” operator (‘&’) is needed. The expression ‘&x’ is read as "the address of x".

Expression          Value
----------------------------------
x                   10
&x                  1001

The value stored in x can be changed at any time (e.g. x = 20), but the address of x (&x) can never be changed.

Un pointer este pur și simplu o variabilă care poate fi folosită pentru a modifica o altă variabilă. Aceasta face acest lucru prin a avea o adresă de memorie pentru rvalue sale. Adică, indică o altă locație din memorie.

Crearea unui indicator la "x" se face după cum urmează:

int* xptr = &x;

The “int*” tells the compiler that we are creating a pointer to an integer value. The “= &x” part tells the compiler that we are assigning the address of x to the rvalue of xptr. Thus, we are telling the compiler that xptr “points to” x.

Presupunând că xptr este atribuit unei adrese de memorie de 1002, atunci memoria programului poate arăta astfel:

Variable    lvalue    rvalue
--------------------------------------------
x           1001      10   
xptr        1002      1001

Următoarea piesă a puzzle-ului este "operatorul de indirecție" ('*'), care este folosit după cum urmează:

int y = *xptr;

Operatorul de indirecție spune programului să interpreteze rvalul lui xptr ca adresă de memorie mai degrabă decât o valoare de date. Adică, programul caută valoarea de date (10) stocată la adresa furnizată de xptr (1001).

Punând totul împreună:

Expression      Value
--------------------------------------------
x                   10
&x                  1001
xptr                1001
&xptr               1002
*xptr               10

Acum că conceptele au fost explicate, iată un cod care demonstrează puterea indicilor:

int x = 10;
int *xptr = &x;

printf("x = %d\n", x);
printf("&x = %d\n", &x);        
printf("xptr = %d\n", xptr);
printf("*xptr = %d\n", *xptr);

*xptr = 20;

printf("x = %d\n", x);
printf("*xptr = %d\n", *xptr);

Pentru ieșirea pe care ați vedea-o (Notă: adresa de memorie va fi diferită de fiecare dată):

x = 10
&x = 3537176
xptr = 3537176
*xptr = 10
x = 20
*xptr = 20

Notice how assigning a value to ‘*xptr’ changed the value of ‘x’. This is because ‘*xptr’ and ‘x’ refer to the same location in memory, as evidenced by ‘&x’ and ‘xptr’ having the same value.

0
adăugat
mulțumesc pentru răspunsul foarte util
adăugat autor timmyg, sursa
Valorile și rvalurile nu au nimic de-a face cu adresele de memorie.
adăugat autor Puppy, sursa

The book that cracked pointers for me was Illustrating Ansi C by Donald Alcock. Its full of hand-drawn-style box and arrow diagrams that illustrate pointers, pointer arithmetic, arrays, string functions etc...

Evident, este o carte "C", dar pentru fundamentele sale de bază este greu de învins

0
adăugat

Unul dintre lucrurile care ma ajutat cu adevărat să înțeleg aceste concepte este de a învăța UML - limba unificată de modelare. Văzând conceptele de proiectare orientate pe obiecte într-un format grafic, m-am ajutat să aflu ce înseamnă ei. Uneori, încercarea de a înțelege aceste concepte doar prin a privi la ce cod sursă le implementează poate fi dificil de înțeles.

Vaderea unor paradigme orientate pe obiect cum ar fi moștenirea în formă grafică este o modalitate foarte puternică de a înțelege conceptul.

UML Distilled lui Martin Fowler este o introducere bună, scurtă.

0
adăugat

Nu există nicio substituire pentru practicare.

Este ușor să citiți printr-o carte sau să ascultați o prelegere și să simțiți că urmați ce se întâmplă.

Ceea ce aș recomanda este să luați câteva exemple de cod (presupun că le aveți pe disc undeva), să le compilați și să le executați, apoi încercați să le schimbați pentru a face ceva diferit.

  • Adăugați o altă subclasă la o ierarhie
  • Adăugați o metodă la o clasă existentă
  • Modificați un algoritm care se repetă transmite printr-o colecție pentru a merge în schimb.

Nu cred că există o carte "cu glonț de argint" care o va face.

Pentru mine, ceea ce a condus acasă ceea ce indică indicii a fost de lucru în adunare, și văzând că un pointer a fost de fapt doar o adresă, și că având un pointer nu înseamnă că ceea ce a arătat a fost un obiect semnificativ.

0
adăugat

Pentru indicatori și clase, aici este analogia mea. Voi folosi un pachet de cărți. Pachetul de cărți are o valoare nominală și un tip (9 de inimi, 4 de pică etc.). Deci, în limba noastră de programare C ++ de "Deck of Cards" vom spune următoarele:

HeartCard card = 4;//4 of hearts!

Acum știi unde sunt cele patru inimi, pentru că, prin gol, țineți puntea, cu fața în mână și este la partea de sus! Deci, în legătură cu restul cărților, vom spune că cele 4 inimi sunt la început. Deci, dacă v-am întrebat ce carte este la ÎNCEPUT, ați spune: "Cele 4 inimi, desigur!". Ei bine, tocmai m-ai arătat unde e cardul. În limbajul nostru de programare "Deck of Cards", puteți spune la fel:

HeartCard card = 4;//4 of hearts!
print &card//the address is BEGINNING!

Acum, întoarceți pachetul de cărți. Partea din spate începe acum și nu știi care este cardul. Dar, să zicem că poți să faci ce vrei, pentru că ești plin de magie. Să facem asta în langauge-ul nostru "Deck of Cards"!

HeartCard *pointerToCard = MakeMyCard( "10 of hearts" );
print pointerToCard//the value of this is BEGINNING!
print *pointerToCard//this will be 10 of hearts!

Ei bine, MakeMyCard ("10 de inimi") faci magia ta și știind că ai vrut să indici spre început, făcând cardul cu 10 inimi! Transformați cardul și, voila! Acum, * te poate arunca. Dacă da, verificați acest lucru:

HeartCard *pointerToCard = MakeMyCard( "10 of hearts" );
HeartCard card = 4;//4 of hearts!
print *pointerToCard;//prints 10 of hearts
print pointerToCard;//prints BEGINNING
print card;//prints 4 of hearts
print &card;//prints END - the 4 of hearts used to be on top but we flipped over the deck!

În ceea ce privește clasele, am folosit clase în exemplul definind un tip ca HeartCard. Știm ce înseamnă HeartCard ... Este o carte cu valoare și tip de inimă! Deci, am clasificat-o ca pe o HeartCard. Fiecare limbă are o modalitate similară de a defini sau "a clasifica" ceea ce doriți, dar toți împărtășesc același concept! Sper că acest lucru a ajutat ...

0
adăugat
A fost o analogie destul de prost.
adăugat autor FlySwat, sursa

Pointers are not some sort of magical stuff, you're using them all the time!
When you say:

int a;

and the compiler generates storage for 'a', you're practically saying that you're declaring
an int and you want to name its memory location 'a'.

When you say:

int *a;

declarați o variabilă care poate deține o locație de memorie a unui int. Este atat de simplu. De asemenea, nu vă temeți de aritmetica pointerului, întotdeauna aveți în minte o "hartă de memorie" atunci când aveți de-a face cu indicii și gândiți-vă în termeni de mers pe jos prin adrese de memorie.

Clasele în C ++ sunt doar o modalitate de a defini tipurile de date abstracte. Aș sugera să citesc o carte bună OOP pentru a înțelege conceptul, atunci, dacă sunteți interesat, aflați cum C ++ compilatoare generează codul pentru a simula OOP. Dar această cunoaștere va veni în timp, dacă rămâi cu C ++ suficient de mult :)

0
adăugat

Your problem seems to be the C core in C++, not C++ itself. Get yourself the Kernighan & Ritchie (The C Programming Language). Inhale it. It's very good stuff, one of the best programming language books ever written.

0
adăugat

În cazul claselor am avut trei tehnici care m-au ajutat într-adevăr să fac saltul în programarea reală orientată pe obiecte.

Primul a fost că am lucrat la un proiect de joc care a făcut uz de clase și obiecte grele, cu folosirea grele a generalizării (tipul de sau este o relație, ex. Studentul este un fel de persoană) și compoziția (are o relație, ex. elevul are un împrumut student). Distrugerea acestui cod a avut o mulțime de lucruri, dar într-adevăr a adus lucrurile în perspectivă.

The second thing that helped was in my System Analysis class, where I had to make http://www.agilemodeling.com/artifacts/classDiagram.htm">UML class diagrams. These I just really found helped me understand the structure of classes in a program.

În cele din urmă, îi ajut pe elevii din colegiu în programare. Tot ce pot spune cu adevărat despre asta este că învățați mult prin predare și văzând abordarea celorlalți față de o problemă. De multe ori un student va încerca lucruri pe care nu le-aș fi gândit niciodată, dar de obicei au un sens și au probleme în a-și implementa ideea.

Sfatul meu cel mai bun este că este nevoie de multă practică și cu cât programați mai mult, cu atât veți înțelege mai bine.

0
adăugat