你如何在课堂上使用字符串?

时间:2014-04-04 04:18:15

标签: c++ string class

我已经做了一段时间了,但我似乎无法弄明白。

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include "student.h"

using namespace std;

int numofstudents = 5;
Student ** StudentList = new Student*[numofstudents];
string tempLname = "smith";
StudentList[0]->SetLname(tempLname);


#include<iostream>
#include <string>

using namespace std;

class Student {

public:
  void SetLname(string lname);
  void returnstuff();

protected:
  string Lname;

};

#include <iostream>
#include "student.h"
#include <iomanip>
#include <cctype>
#include <cstring>
#include <string>

using namespace std;

void Student::SetLname(string lname) {
  Lname = lname;
}

我想要做的就是将Lname设置为smith但是当我运行我的程序时,它会在运行后没有告诉我错误而崩溃。 任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

您的问题与使用字符串无关。它与使用指针有关。

Student ** StudentList=new Student*[numofstudents];

这会分配一个Student指针数组。它不分配Student对象数组。因此,在这行代码中,您有一个包含5个无效指针的数组。当您尝试访问它们时,这是一个问题,就好像它们指向Student对象一样:

StudentList[0]->SetLname(tempLname);

为了使该行有效,StudentList[0]首先需要指向有效的Student对象。您可以将其设置为现有对象:

Student st;
StudentList[0] = &st;

或者你可以分配一个新对象:

StudentList[0] = new Student;

否则摆脱额外的间接水平:

Student * StudentList=new Student[numofstudents];
...
StudentList[0].SetLname(tempLname);

但是为什么你会这样做呢?如果您需要Student个对象的一维动态集合,请使用标准库中的sequence container,例如std::vector

答案 1 :(得分:0)

Student ** StudentList=new Student*[numofstudents];更改为

Student ** StudentList=new Student*[numofstudents];
for(int i = 0; i<numofstudents; i++)
    StudentList[i] = new Student();

答案 2 :(得分:0)

您创建了指向Student的指针数组,但是数组的元素未初始化,因此任何元素的取消引用,特别是[0]都会导致崩溃。 使用“std :: vector StudentList(numofstudents);”而是在代码“StudentList [0] .SetLname(tempLname);”

中进行微小更改