0

我试图弄清楚课程是如何运作的,但我遇到了一些麻烦

主文件

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

void main()
{
Student students;

students.Print();

system("pause");

}

学生.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;
};

学生.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

阅读有关的参考资料std::string,您会发现一个名为的方法,该方法c_str用于获取可用于例如printf.

或者只是开始使用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);

您不能将 C++ 传递给std::stringCprintf函数;只能传递与 C 语言共享的基本类型;传递类类型将导致未定义的行为。

您可以使用 C++ 输出:

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

或者,如果您出于某种原因真的想使用 C 输出,则可以从以下内容中提取 C 风格的字符串std::string

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不过,一个人有两个名字和两个 ID似乎有点奇怪。那个班级不应该只代表一个人吗?

于 2012-08-07T08:17:16.143 回答
0

此外,可以将这些成员放在一种数组中,这样我就可以通过 student[0] 和 student[1] 来打印它?

当然。如果您预先知道学生人数,那么您可以:

string students[2];

该语句将有效地string在内存中分配两个对象,您可以通过数组索引引用它们中的每一个。

如果您不知道需要多少学生,那么最好使用std::vector类,因为它是在 C++ 中表示动态数组的首选方式。

您将 studentOne、studentTwo、IDOne 和 IDtwo 数据成员放在类声明的私有部分下。这意味着您只能在Student类实现中直接操作它们。大多数其他程序员希望您遵循的方法是创建特殊的 getter 和 setter 方法:

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 回答