2014-04-04 66 views
0

嗯,我一直在努力這一段時間,但我似乎無法弄清楚。你如何在課堂上使用字符串?

#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; 
} 

所有我想要做的是設置Lnamesmith但是當我運行我的程序崩潰,沒有它運行後告訴我的錯誤。 任何幫助將不勝感激!

+0

謝謝你們我希望我早點問過這個問題:p – user3091585

回答

0

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

Student ** StudentList=new Student*[numofstudents]; 
for(int i = 0; i<numofstudents; i++) 
    StudentList[i] = new Student(); 
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

0

您創建了指向Student的指針數組,但數組的元素未初始化,因此對任何元素(特別是[0])的解引用都會導致崩潰。 使用「std :: vector StudentList(numofstudents);」而不是在代碼「StudentList [0] .SetLname(tempLname);」