PDA

Visualizza la versione completa : [C++] Classe


Necsus
08-02-2008, 21:51
Salve a tutti, avevo intenzione di realizzare un programma in C++ utilizzando una classe.
È la prima volta che ne utilizzo una ed infatti ho riscontrato alcuni problemi che spero voi riusciate a risolvermi, aiutandomi ad imparare :D

Questa è la codifica:



#include <iostream.h>
using namespace std;

class alunno {
public:
int materie,materia;
float matrice[materie][3];
float GetMedia() {
for(int i=0;i<3;i++)
float media[materia]+=matrice[materia][i];
return media[materia];
}
float TotalMedia() {
for(int i=0;i<3;i++)
{
for(int k=0;k<materie;k++)
float mediaTot+=matrice[materia][i];
}
return mediaTot;
}
};

int main() {
alunno pallino;
cout << "Quante materie sono?" << endl;
cin >> pallino.materie;
cout << "Tra " << pallino.materie << "materie, con quale iniziamo? (indicare con 1 per la prima, 2 per la seconda e così via)" << endl;
cin >> pallino.materia;
for (int i=0;i<pallino.materie;i++)
{
switch(i)
{
case 0: cout << "Inserisci voto orale" << endl;break;
case 1: cout << "Inserisci voto scritto" << endl;break;
case 2: cout << "Inserisci voto pratico" << endl;break;
default: continue;
}
cin >> pallino.matrice[pallino.materia][i];
}
cout << "La media è " << GetMedia() << endl;
return 0;
}


I problemi in compilazione sono questi:



classe.cpp:6: error: invalid use of non-static data member ‘alunno::materie’
classe.cpp:7: error: from this location
classe.cpp:7: error: array bound is not an integer constant
classe.cpp: In member function ‘float alunno::GetMedia()’:
classe.cpp:10: error: expected initializer before ‘+=’ token
classe.cpp:11: error: ‘media’ was not declared in this scope
classe.cpp: In member function ‘float alunno::TotalMedia()’:
classe.cpp:17: error: expected initializer before ‘+=’ token
classe.cpp:19: error: ‘mediaTot’ was not declared in this scope
classe.cpp: In function ‘int main()’:
classe.cpp:38: error: ‘class alunno’ has no member named ‘matrice’
classe.cpp:40: error: ‘GetMedia’ was not declared in this scope


Come potrei risolvere?
Grazie a tutti per eventuali risposte! :)

MacApp
08-02-2008, 22:31
Il codice è pregno d'errori e warning.

Primo warning:

Non includere #include <iostream.h> ma #include <iostream>
ragione?


warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.


Primo errore:


float matrice[materie][3];

"materie" che valore ha a tempo di compilazione?
Il compilatore non lo sa, perciò si arrabbia.

Necsus
08-02-2008, 22:39
Ho tolto il .h ed ho inizializzato le due variabili materia e materie a 0.



classe.cpp:6: error: ISO C++ forbids initialization of member ‘materie’
classe.cpp:6: error: making ‘materie’ static
classe.cpp:6: error: ISO C++ forbids in-class initialization of non-const static member ‘materie’
classe.cpp:6: error: ISO C++ forbids initialization of member ‘materia’
classe.cpp:6: error: making ‘materia’ static
classe.cpp:6: error: ISO C++ forbids in-class initialization of non-const static member ‘materia’
classe.cpp:7: error: array bound is not an integer constant
classe.cpp: In member function ‘float alunno::GetMedia()’:
classe.cpp:10: error: expected initializer before ‘+=’ token
classe.cpp:11: error: ‘media’ was not declared in this scope
classe.cpp: In member function ‘float alunno::TotalMedia()’:
classe.cpp:17: error: expected initializer before ‘+=’ token
classe.cpp:19: error: ‘mediaTot’ was not declared in this scope
classe.cpp: In function ‘int main()’:
classe.cpp:38: error: ‘class alunno’ has no member named ‘matrice’
classe.cpp:40: error: ‘GetMedia’ was not declared in this scope

Necsus
09-02-2008, 18:11
Altre idee? :master:

shodan
09-02-2008, 18:35
Non mi sembra che MacApp ti abbia detto di togliere l'header file, ma solo di cambiare da <iostream.h> ad <iostream>

Poi non si può inizializzare la dimensione di un array con una variabile sconosciuta a compile time. (Ed è questo che intendeva dire con il secondo quote).

Questa è una dichiarazione valida.


const int materie(3); // deve essere esterno alla classe
float matrice[materie][3];

Questa no. (Solo lo standard C99 riconosce una sintassi simile. Il C++ no )


int materie(3);
float matrice[materie][3];

Altimenti devi allocare l'array con new.
Dopodichè ricorda che un metodo di una classe può essere chiamato solo se c'è un oggetto dichiarato di quella classe (fanno eccezione solo i metodi static).


cout << "La media è " << GetMedia() << endl;

qui manda l'oggetto a cui appartiene GetMedia()

MacApp
10-02-2008, 01:49
Originariamente inviato da shodan
Non mi sembra che MacApp ti abbia detto di togliere l'header file, ma solo di cambiare da <iostream.h> ad <iostream>

eddai, magari con "Ho tolto il .h" intendeva proprio quello.
;-P

shodan
10-02-2008, 12:58
D'oh! Mea culpa, non ci avevo pensato. :stordita:

Necsus
10-02-2008, 20:03
Originariamente inviato da shodan
D'oh! Mea culpa, non ci avevo pensato. :stordita:

Sì, infatti.
Avevi capito male :)

Cmq oggi a mente fredda ho ridato una lettura al codice accorgendomi che presentava davvero dei errori incredibili, oltre che di sintassi anche errori semantici.
La stanchezza ha avuto il suo peso, ieri :D

Grazie cmq per la vostra collaborazione!

Ecco la codifica corretta, se vi interessa:



#include <iostream>
using namespace std;

#define materie 3

class alunno {
public:
float matrice[materie][3];
float GetMedia(int k) {
float somma=0.;
float media;
for(int i=0;i<3;i++)
{
somma+=matrice[k][i];
}
media=somma/3;
return media;
}
float TotalMedia() {
float sommaTot=0.;
float mediaTot;
for(int i=0;i<3;i++)
{
for(int k=0;k<materie;k++)
sommaTot+=matrice[i][k];
}
mediaTot=sommaTot/(materie*3);
return mediaTot;
}
};


int main() {
alunno pallino;
for (int k=0;k<materie;k++)
{
for (int i=0;i<3;i++)
{
switch(i)
{
case 0: cout << "Inserisci voto orale ";break;
case 1: cout << "Inserisci voto scritto ";break;
case 2: cout << "Inserisci voto pratico ";break;
default: break;
}
cout << "della " << (k+1) << "° materia" << endl;
cin >> pallino.matrice[k][i];
}
cout << "La media è " << pallino.GetMedia(k) << endl;
}
cout << "La media totale è " << pallino.TotalMedia() << endl;
return 0;
}

Loading