|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Feb 2011
Messaggi: 9
|
Classi e relativo funzionamento
Come ogni comune mortale durante lo studio delle classi del c++, incontro non pochi problemi.
In questi giorni sto studiando un programma che racchiude una bella cernita di argomenti fin qui studiati, pur avendo studiato e ristudiato tutti gli elementi di questo programma, ho dei dubbi sul loro utilizzo e su come interagiscono venendo utilizzati in quel modo. il programma è il seguente, utilizza una classe di nome display. all' esecuzione del programma a video appaiono 3 modalità di risoluzione pixel; Codice:
#include <iostream> using namespace std; enum resolution {bassa,media,alta}; //le enumerazioni sono un modo per dare dei nomi a dei numeri //lista enum //sostanzialmente una lista di costanti intere class display{ private: //dichiarazione dati e funzioni privati int larghezza; int altezza; resolution res; public: //dichiarazione dati e funzioni pubbliche void set_dim(int w, int h){larghezza=w; altezza=h;} // funzioni void get_dim(int &w, int &h){w=larghezza; h=altezza;} // in void set_res(resolution r){res=r;} // linea resolution get_res(){return res;} }; char names[3][7] = {//3 è il numero delle righe "bassa ", //7 è il numero della stringa massima + spazio + byte null. "media ", "alta " }; /** rappresentazione array bidimensionale * * "b" "a" "s" "s" "a" " " "\0" * "m" "e" "d" "i" "a" " " "\0" * "a" "l" "t" "a" " " "\0" dump * 0 1 2 3 4 5 6 * da 0 a 6, 7 numeri */ int main() { display display_mode[3]; //dichiarazione array di tipo display(classe) di 3 elementi int i,w,h; display_mode[0].set_res(bassa); display_mode[0].set_dim(640, 480); display_mode[1].set_res(media); display_mode[1].set_dim(800, 600); display_mode[2].set_res(alta); display_mode[2].set_dim(1600, 1200); cout <<"Modalita' video disponibili: \n\n"; for(i=0; i<3; i++){ cout << names[display_mode[i].get_res()]; display_mode[i].get_dim(w,h); cout <<w <<" per "<<h<<" "<<endl; } return 0; } 1) la funzione in linea void get_dim(int &w, int &h){w=larghezza; h=altezza;} differisce dalla void set_dim(int w, int h) {larghezza=w; altezza=h;} perché l'informazione che si vuole ottenere è "ottieni l'indirizzo della variabile". la mia domanda è: perché devo utilizzare l'indirizzo di memoria e non la variabile senza operatore unario? Ovviamente Togliendo & il compilatore fa il suo dovere senza errori, ma non funziona correttamente. 2) nel ciclo for la prima istruzione riporta: cout << names[display_mode[i].get_res()]; names è dichiarato in ambito globale come array di tipo char bidimensionale, questo vorrebbe dire che quando viene chiamato in qualche funzione, dovrebbe comunque riportare una coppia di valori? invece all' interno delle sue parentesi graffe viene chiamato display_mode[i].get_res(), quando mi sarei aspettato una chiamata ad esempio names[qualocosa][qualcos'altro], dov'è la mia lacuna? chiedo scusa se sono stato prolisso, ma non riuscivo ad essere meno sintetico. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 3826
|
EDIT: mi sa che avevo scritto mezza cazzata, non notando che si trattava di reference.
![]() Ultima modifica di GTKM : 27-06-2016 alle 14:05. |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2284
|
Quote:
(https://en.wikipedia.org/wiki/Reference_(C%2B%2B)) 2. names vedila come un array di puntatori (a puntatori): quindi names[0] ritornerà il primo puntatore, names[1] il secondo e così via: ecco quindi che dire names[i] risulta essere perfettamente lecito (prendi l'i-esimo puntatore), che poi anche quel puntatore sia un array è poco rilevante nel tuo caso
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:28.