我正在试图弄清楚课程是如何工作的,但我遇到了一些麻烦
的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。此外,可以将这些成员放在一个数组中,这样我就可以通过学生[0]和学生[1]来打印它?
答案 0 :(得分:4)
阅读有关std::string
的参考资料,您将找到一个名为c_str
的方法,该方法用于获取可在例如{3}中使用的C风格字符指针。 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';
}
答案 1 :(得分:1)
你需要使用像vector这样的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();
}
}
答案 2 :(得分:0)
printf("Student name: %s\n", studentOne);
导致未定义的行为。您需要传递一个适合%s
格式说明符的c样式字符串,即studentOne.c_str()
。
可以将这些成员放在一个数组中,这样我就可以 通过学生[0]和学生[1]
打印出来
您始终可以将std::string
数组声明为任何其他数据类型。
class Student
{
...
string students[N]; // or vector<string> students;
};
答案 3 :(得分:0)
printf("Student name: %s\n", studentOne);
您无法将C ++ std::string
传递给C printf
函数;你只能传递与C语言共享的基本类型;传递类类型将导致未定义的行为。
您可以使用C ++输出:
std::cout << "Student name: " << studentOne << std::endl;
或者,如果你真的想出于某种原因使用C输出,你可以从std::string
中提取C风格的字符串:
printf("Student name: %s\n", studentOne.c_str());
^^^^^^^^
另外,可以将这些成员放在一个数组类型中,这样我就可以通过学生[0]和学生[1]来打印它?
是的,您可以将大多数类型(包括类)放在数组中:
std::string student[2]; // array of two strings.
如果需要变量编号,请使用动态数组:
std::vector<std::string> student;
但是,单个Student
有两个名称和两个ID似乎有点奇怪。那个班不应只代表一个人吗?
答案 4 :(得分:0)
另外,可以将这些成员放在一个数组类型中,这样我就可以通过学生[0]和学生[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;}
或者,公开对字段的直接访问(即将它们重定位到公共部分下)不是禁忌。请记住,这不是大多数人所期望的。