Итак, я хотел создать класс, который будет заниматься учеником, у которого есть имя и определенное максимальное количество предметов, по которым он может иметь ограниченное количество оценок (выраженное числами от 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";
    }
}
}
c++
0
Gabriele Trainiti 21 Окт 2019 в 23:51

1 ответ

Лучший ответ

new дает вам указатель на вновь выделенную память. Ошибка сообщает вам, что вы не можете назначить Studente* на Studente, т.е. вам необходимо использовать:

Studente* s = new Studente(...)

Или еще лучше, просто выделите объект в стеке, поскольку в этом случае вам не нужна память кучи:

Studente s{nome, quantematerie, nomimaterie};

Или, если вы настаиваете на использовании кучи, используйте интеллектуальные указатели для лучшей семантики, автоматическая очистка и т. д.

2
0x5453 21 Окт 2019 в 20:59