2013-11-03 78 views
1

我在使用指針使用動態字符串數組的程序遇到問題。完成函數courseLoad中的數組元素的打印後,出現分段錯誤(Core Dumped)錯誤。這裏是我的代碼:C++打印字符串的動態數組錯誤

5 #include<iostream> 
6 #include<cstdlib> 
8 
9 using namespace std; 
10 
11 class Student 
12 { 
13  public: 
14   string name; 
15   int numClasses; 
16   string* classList; 
17 
18 Student() {}; 
19  Student(string, int, string*); 
20  ~Student() {delete[] classList;}; 
21 
22  string getName(); 
23  void setName(); 
24  int getNumClasses(); 
25  void setNumClasses(); 
26  string* getClassList(); 
27  void setClassList(); 
28 
29  void inputs(); 
30  void courseLoad(); 
31  void emptyClasses(); 
32 
33  Student operator=(const Student& other); 
34 
35 }; 
36 
37 Student::Student(string name, int numClasses, string* classList) 
38 { 
39  this->name = name; 
40  this->numClasses = numClasses; 
41  classList = new std::string[100](); 
42 } 
43 
44 string Student::getName() 
45 { 
46  return name; 
47 } 
48 
49 void Student::setName() 
50 { 
51  cout << "Please type the name of the student: "; 
52  cin >> name; 
53 } 
54 
55 int Student::getNumClasses() 
56 { 
57  return numClasses; 
58 } 
59 
60 void Student::setNumClasses() 
61 { 
62  cout << "Please enter the amount of classes this student is taking: "; 
63  cin >> numClasses; 
64 } 
65 
66 string* Student::getClassList() 
67 { 
68  return classList; 
69 } 
70 
71 void Student::setClassList() 
72 { 
73  cout << "Please enter the classes that this student is taking: "; 
74  for(int i = 0; i < numClasses; i++) 
75  { 
76   getline(cin, classList[i]); 
77  } 
78 } 
79 
80 void Student::inputs() 
81 { 
82 string word; 
83 classList = new string[100]; 
84 
85  cout << "Please enter the name of the student: "; 
86  getline(cin, name); 
87  cout << "Please enter the number of classes that " << name << " is taking: "; 
88  cin >> numClasses; 
89  cin.ignore(); 
90 
91  cout << "Please enter the names of the classes " << name << " is taking: "; 
92  for(int i = 0; i < numClasses; i++) 
93  { 
94  getline(cin, word); 
95  classList[i] = word; 
96  } 
97 } 
98 
99 void Student::courseLoad() 
100 { 
101  cout << name << endl; 
102  cout << "===============================" << endl; 
103  for(int i = 0; i < numClasses; i++) 
104  { 
105  cout << classList[i]; 
106  cout << "\n"; 
107  } 
108 } 
109 
110 void Student:: emptyClasses() 
111 { 
112  numClasses = 0; 
113  for(int i = 0; i < numClasses; i++) 
114  { 
115   classList[i] = ""; 
116  } 
117 } 
118 
119 Student Student::operator=(const Student& other) 
120 { 
121 Student temp; 
122 return (temp); 
123 } 
124 
125 int main() 
126 { 
127  Student s1, s2; 
128 
129  s1.inputs(); 
130  cout << "Student 1's Data: "; 
131  s1.courseLoad(); 
132  cout << "Hello"; 
133 
134  s2 = s1; 
135  cout << "Student 2's data after assignment from student 1: " << endl; 
136  s2.courseLoad(); 
137 
138  s1.emptyClasses(); 
139  cout << "Student 1's data after reset: " << endl; 
140  s1.courseLoad(); 
141 
142  cout << "Student 2's data, should still have original classes: " << endl; 
143  s2.courseLoad(); 
144 
145  return 0; 
146 } 
+0

在繼續之前,您應該考慮刪除'numClasses'和'classList'並使用'std :: vector'。 – diapir

+0

我想避免使用std :: vector ,但我無法弄清楚什麼是錯的,所以我使用它。該計劃現在運作,感謝您的幫助! – Weava

+0

我無法想象爲什麼你要使用這個項目的其他任何東西*除了* std :: vector '如果因爲你認爲動態分配是「更好」,那麼請放心,已經爲'std ::矢量<>'。這真的是更好的方法。 – WhozCraig

回答

0
Student Student::operator=(const Student& other) 
{ 
    Student temp; 
    return (temp); 
} 

以上成員函數的期望是做一名成員老虎鉗從other複製到當前對象。在你的情況下, 賦值操作沒有任何用處。當你說 -

s2 = s1; 

s1內容都不是真正得到複製到s2。因此,撥打s2.courseLoad();會產生不可預測的結果。有關更多信息,請閱讀What is The Rule of Three ?