因此,我想创建一个类来处理一个学生,这个学生有一个名字,并定义了最大的科目数量,为此他可以有有限的分数(以浮点数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";
    }
}
}

最佳答案

new为您提供指向新分配的内存的指针。该错误告诉您不能将Studente*分配给Studente,即您需要使用:

Studente* s = new Studente(...)


或者更好的方法是,只需在堆栈上分配对象,因为在这种情况下不需要堆内存:

Studente s{nome, quantematerie, nomimaterie};


或者,如果您坚持使用堆,请使用smart pointers以获得更好的语义,自动清除等。

关于c++ - 转换为非标量误差意味着什么?我该如何解决?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58493967/

10-08 22:45