0

クラスがどのように機能するかを理解しようとしていますが、少し問題があります

main.cpp

#include <stdio.h>
#include "Student.h"
#include <stdlib.h>

void main()
{
Student students;

students.Print();

system("pause");

}

Student.h

#pragma once
#include <string.h>
#include <iostream>
using namespace std;

class Student
{
public:
    Student(void);
    ~Student(void);
    void Print(void);
private:
    int IDone;
    int IDtwo;
    string studentOne;
    string studentTwo;
};

Student.cpp

#include "Student.h"

Student::Student(void)
{
    studentOne = "John Doe";
    studentTwo = "Jane Doe";
    IDone = 227768;
    IDtwo = 227769;
}

Student::~Student(void)
{
}
void Student::Print(void)
{
    printf("Student name: %s\n", studentOne);
    printf("Student ID: %d\n", IDone);
    printf("Student name: %s\n", studentTwo);
    printf("Student ID: %d\n", IDtwo);

}

これを実行すると、次のようになります。

    Student name: <null>
    Student ID: 227768
    Student name: <null>
    Student ID: 227769

後で名前とIDを変更できるようにしたいと思います。また、これらのメンバーを一種の配列に含めることもできるので、student[0]とstudent[1]に移動して印刷できますか?

4

5 に答える 5

4

に関するリファレンスを読むと、たとえばで使用できるCスタイルの文字ポインタを取得するために使用されるstd::stringという名前のメソッドが見つかります。c_strprintf

または、std::cout代わりに使用を開始します。

void Student::Print(void)
{
    std::cout << "Student name: " << studentOne << '\n';
    std::cout << "Student ID: " << IDone << '\n';
    std::cout << "Student name: " << studentTwo << '\n';
    std::cout << "Student ID: " << IDtwo << '\n';
}
于 2012-08-07T08:10:54.830 に答える
1

生徒の詳細を格納するには、配列ではなくベクトルなどのstlコンテナを使用する必要があり、生徒のクラスを次のように改造する必要があります。

class Student
{
private:
 string Name;
 int    Id;
public:
 Student(string name, int id);
 string GetName();
 void SetName(name);
 int GetId();
 void SetId(int id);
 void Print();
};

そしてあなたのメインはこのようになるはずです

   void main()
    {
      vector<Student> studentList;

      Studen one("John Doe", 1);
      Studen two("Jane Doe", 2);

      studentList.push_back(one);
      studentList.push_back(two);

      vector<Student>::const_iterator cii;
      for(cii=Student.begin(); cii!=Student.end(); cii++)
       {
          *cii.Print();

       }

    }
于 2012-08-07T08:11:34.373 に答える
0
printf("Student name: %s\n", studentOne);

未定義の動作になります。%sフォーマット指定子に適したACスタイルの文字列を渡す必要がありますstudentOne.c_str()

これらのメンバーを一種の配列にすることができるので、student[0]とstudent[1]に移動して印刷できます。

std::stringの配列は、他のデータ型と同じようにいつでも宣言できます。

class Student
{
  ...
  string students[N];  // or vector<string> students;
};
于 2012-08-07T08:12:28.317 に答える
0
printf("Student name: %s\n", studentOne);

std::stringC++をCprintf関数に渡すことはできません。C言語と共有されている基本型のみを渡すことができます。クラスタイプを渡すと、未定義の動作が発生します。

C++出力を使用できます。

std::cout << "Student name: " << studentOne << std::endl;

または、何らかの理由でC ouputを本当に使用したい場合は、std::string:からCスタイルの文字列を抽出できます。

printf("Student name: %s\n", studentOne.c_str());
                                       ^^^^^^^^

また、これらのメンバーを一種の配列に含めることもできるので、student[0]とstudent[1]に移動して印刷できますか?

はい、クラスを含むほとんどの型を配列に入れることができます。

std::string student[2]; // array of two strings.

変数番号が必要な場合は、動的配列を使用します。

std::vector<std::string> student;

Studentただし、1人が2つの名前と2つのIDを持つのは少し奇妙に思えます。そのクラスはただ一人を代表するべきではありませんか?

于 2012-08-07T08:17:16.143 に答える
0

また、これらのメンバーを一種の配列に含めることもできるので、student[0]とstudent[1]に移動して印刷できますか?

もちろん。事前に学生の数を知っている場合は、次のことができます。

string students[2];

このステートメントはstring、メモリ内に2つのオブジェクトを効果的に割り当て、配列インデックスによってそれぞれを参照できます。

必要な生徒の数がわからない場合は、std::vectorクラスを使用するのが最善です。これは、C++で動的配列を表すための好ましい方法だからです。

クラス宣言のプライベートセクションの下に、studentOne、studentTwo、IDOne、およびIDTwoデータメンバーを配置しました。Studentこれは、クラス実装内でのみそれらを直接操作できることを意味します。他のプログラマーのほとんどが従うことを期待するアプローチは、特別なゲッターメソッドとセッターメソッドを作成することです。

const std::string& studentOne() const {return studentOne;}
void setStudentOne(const std::string& aStudentOne) {studentOne = aStudentOne;}

等々。作成setStudentOneは、副作用が必要な場合に特に便利です。それ以外の場合は、単一の方法でアクセスできます。

std::string& getStudentOne() {return studentOne;}

あるいは、フィールドへの直接アクセスを公開する(つまり、フィールドをパブリックセクションの下に再配置する)ことはタブーではありません。これはほとんどの人が期待するものではないことを覚えておいてください。

于 2012-08-07T08:23:45.110 に答える