Итак, я хотел создать класс, который будет заниматься учеником, у которого есть имя и определенное максимальное количество предметов, по которым он может иметь ограниченное количество оценок (выраженное числами от 1 до 10). В коде есть итальянские слова в качестве переменных и комментариев, но я думаю, что то, что я пытался сделать, довольно понятно. Структура представляет собой массив из 15 элементов, каждый из которых содержит имя, массив меток и счетчик. Конструктор задает имена субъектов и устанавливает для всех отметок значение 0 (и я объясню почему). Методы: getMaterie печатает все предметы; setVoto ставит отметку в определенной теме и увеличивает счетчик; getVoti печатает все отметки предмета; getMedia вычисляет среднее значение ваших оценок и возвращает значение (для этого я использовал счетчик, иначе он был бы / 30, и это неверно).
Моя ошибка находится в строке 66: запрошено преобразование из "Studente *" в нескалярный тип "Studente"
#include <iostream>
#include <string>
using namespace std;
struct mat{
string nome;
float voti[30];
int counter;
}m[15];
class Studente{
private:
string nome;
string materia[];
public: Studente(string nom, int nm, string nomemateria[]){ //costruttore: richiesti nome dello studente, nome delle materie e l'indice per indicare
nome = nom; //la quantità delle materie
for(int i=0; i<nm; i++){ //ciclo con cui si impostano i nomi delle materie
m[i].nome = nomemateria[i];
for(int j=0; j<30; j++){ //ciclo con cui si impostano a ZERO tutti gli elementi degli array dei voti (per la media!)
m[i].voti[j]=0;
}
}
}
public: void getMaterie(int nm){ //si richiede il numero di materie totali. E' necessario perchè l'utente può decidere (su un massimo di 15)
for(int i=0; i<nm; i++){
cout<<i<<" "<<m[i].nome;
}
}
public: void setVoto(int nm, float voto){ //si richiede il numero di materia alla quale inserire il voto, e il voto da inserire
m[nm].voti[m[nm].counter] = voto;
m[nm].counter++;
}
public: void getVoti(int nm){ //si richiede il numero di riferimento della materia della quale si vogliono stampare i voti
for(int i=0; i<nm; i++){
cout<<m[i].voti[i]<<" ";
}
}
public: float getMedia(int nm){ //si richiede l'indice della materia di cui si vuole fare la media dei voti
float media=0;
for(int i=0; i<30; i++){
media+= m[nm].voti[i];
}
return (media/m[nm].counter);
}
};
int main(){
string nome;
int quantematerie;
cout<<"Inserisci nome studente: "; cin>>nome;
cout<<"Inserisci numero delle materie: "; cin>>quantematerie;
string nomimaterie[quantematerie];
for(int i=0; i<quantematerie; i++){
string risposta;
cout<<"Inserisci nome materia "<<i+1<<": "; cin>>risposta;
nomimaterie[i] = risposta;
}
Studente s = new Studente(nome, quantematerie, nomimaterie);
int scelta = 0;
while(1){
cout<<"1. Stampa tutte le materie 2.Imposta voto in materia x 3.Guarda voti materia x 4.Media materia x 0. Esci"<<endl<<"Scelta: "; cin>>scelta;
switch(scelta){
case 1: s.getMaterie(quantematerie);
case 2: int materia; float voto; cout<<"Inserici numero materia a cui aggiungere voto: "; cin>>materia;
cout<<"Inserisci voto da inserire: "; cin>>voto; s.setVoto(materia, voto); break;
case 3: cout<<"Inserisci numero materia: "; cin>>materia; s.getVoti(materia); break;
case 4: cout<<"Inserisci numero materia: "; cin>>materia; s.getMedia(materia); break;
case 0: return 0;
default: cout<<"Valore non riconosciuto";
}
}
}
1 ответ
new
дает вам указатель на вновь выделенную память. Ошибка сообщает вам, что вы не можете назначить Studente*
на Studente
, т.е. вам необходимо использовать:
Studente* s = new Studente(...)
Или еще лучше, просто выделите объект в стеке, поскольку в этом случае вам не нужна память кучи:
Studente s{nome, quantematerie, nomimaterie};
Или, если вы настаиваете на использовании кучи, используйте интеллектуальные указатели для лучшей семантики, автоматическая очистка и т. д.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .