0

学生情報 (名前、ID 番号、および学位) のクラスを作成しようとしましたが、この情報は画面に出力されます。しかし、エラーがどこにあるのかわからない?!

#include <iostream>
#include <conio.h>
using namespace std;

class Student {
private:
    char name;
    int idnumber;
    char degree;
public:
    Student(char,int,char);
    void setName(char n){name = n;}
    int getName(){return name;}
    void setIdnumber(char id){idnumber = id;}
    int getIdnumber(){return idnumber;}
    void setDegree(char d){degree = d;}
    int getDegree(){return degree;}
};
Student::Student(char n,int id,char d){
    name = n;
    idnumber = id;
    degree = d;
}

int main(){
    Student s1, s2;
    s1.setName(Sara);
    s1.setIdnumber(333);
    s1.setDegree(A);
    s2.setName(Jack);
    s2.setIdnumber(222);
    s2.setDegree(B);
    cout << "name: " << s1.getName() << ",IDnumber: " << s1.getIdnumber() << ",Degree: " <<      s1.getDegree() << endl;
    cout << "name: " << s2.getName() << ",IDnumber: " << s2.getIdnumber() << ",Degree: " << s2.getDegree() << endl;

    getch();
    return 0;
}
4

3 に答える 3

2

どうやら、次の問題があります。

 Student s1, s2;

これは を呼び出そうとしますdefault constructor。ただし、3 つのパラメーターを受け取るコンストラクターを定義したため、コンパイラーがデフォルトのコンストラクターを生成することを禁止しているため、これらのオブジェクトの作成に失敗し、フォローアップのメンバー関数呼び出しが実質的に失敗します。

s1.setName(Sara);

setNamechar文字列リテラルを意味する場合は、パラメーターの型として型を取り"Sara"ます。問題が発生します。同様の問題は、他の関数呼び出しでも見られます。これを修正する必要があります。

一方、member initialization listメンバーを初期化するには、コンストラクター本体で代入を使用する代わりに使用することをお勧めします。

  Student::Student(char n,int id,char d): name(n), idnumber(id), degree(d){}

メンバーが の順に宣言されていることを確認してくださいname, idnumber, degree

于 2013-05-30T03:41:24.823 に答える
1

char は、文字列ではなく単一の文字です。代わりに std::string を使用してみてください。

また、文字列リテラルを宣言するには、文字列を引用符 "" で囲みます。例:

s1.setName("Sara");

また、std::string を使用するには、#include <string>

于 2013-05-30T03:41:14.237 に答える
0

あなたのコードにはほとんど問題がありません

char name; 

ここでの name は単なる char リテラルであるため、文字列 Sara を渡そうとしている間は 1 つのリテラルのみが格納されます。名前を配列またはポインタに変更します

char name[10] or char *name

また、名前を渡すときは、"Sara" のように二重引用符で渡します。関数内のすべての仮引数を char 配列またはポインターに変更します。

Student s1, s2;

ここで、オブジェクト s1 と s2 を作成しているときに、提供していないデフォルトのコンストラクターが呼び出されます。そのため、コードにデフォルトのコンストラクターを含めます。

Student(){}

s1.setDegree(A);

ここでは、変数ではなくリテラルを渡そうとしているので、引用してください

s1.setDegree('A');

C++ では、char や char[] に対して wrt で非常に使いやすい string データ型が提供されているので、それを使用します。int、double などの他のデータ型を使用するように操作できます。これにより、 strcpy() を使用して文字列をコピーすることで、配列の長さを指定する手間が省けます。

string name;
于 2013-05-30T04:25:32.963 に答える