2014-12-04 28 views
0

我正在嘗試爲=操作符編寫一個重載,以便它可以直接將一個學生對象分配給另一個學生對象。所以它會複製所有的私人數據成員。這是我到目前爲止。重載operator =,讀取字符串時出錯

.H

#ifndef PROJECT3HEADER_H 
#define PROJECT3HEADER_H 

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 
class Student 
{ 
public: 
Student(); 


void Setlname(string lname); 
void Setfname(string fname); 
void SetAverage(float Average); 
void SetLettergrade(char lettergrade); 
void SetTestScore1(float score1); 
void SetTestScore2(float score2); 
void SetTestScore3(float score3); 
void SetTestScore4(float score4); 
void SetTestScore5(float score5); 

string Getlname()const; 
string Getfname()const; 
float GetAverage()const; 
char GetLetterGrade()const; 
float GetScore1()const; 
float GetScore2()const; 
float GetScore3()const; 
float GetScore4()const; 
float GetScore5()const; 

//void operator = (const Student & rhs); 
Student operator=(const Student &rhs); 

private: 
string lname,fname; 
float testScore[5]; 
float Average; 
char lettergrade; 
}; 
ostream & operator << (ostream &, const Student & pt); 
//istream& operator >> (istream& in, Student& pt); 

#endif 

Studentmem.cpp

#include "Project3Header.h" 

#include <iostream> 
#include <string> 

using namespace std; 

Student::Student() 
{ 
    lname=""; 
    fname=""; 
    Average=0; 
    lettergrade=' '; 
    testScore[0]=0,testScore[1]=0,testScore[2]=0,testScore[3]=0,testScore[4]=0; 
     } 
     void Student::Setlname(string lname1){ 
    lname=lname1; 
    } 
    void Student::Setfname(string fname1){ 
    fname=fname1; 
    } 
    void Student::SetAverage(float average1){ 
    Average=average1; 
    } 
    void Student::SetLettergrade(char lettergrade1){ 
    lettergrade=lettergrade1; 
    } 
    void Student::SetTestScore1(float score1){ 
    testScore[0]=score1; 
    } 
    void Student::SetTestScore2(float score2){ 
    testScore[1]=score2; 
    } 
    void Student::SetTestScore3(float score3){ 
    testScore[2]=score3; 
    } 
    void Student::SetTestScore4(float score4){ 
    testScore[3]=score4; 
    } 
    void Student::SetTestScore5(float score5){ 
    testScore[4]=score5; 
    } 

    string Student::Getlname()const { 
    return lname; 
    } 
    string Student::Getfname()const { 
    return fname; 
    } 
    float Student::GetAverage() const{ 
    return Average; 
    } 
    char Student::GetLetterGrade()const{ 
    return lettergrade; 
    } 
    float Student::GetScore1() const{ 
    return testScore[0]; 
    } 
    float Student::GetScore2() const{ 
    return testScore[1]; 
    } 
    float Student::GetScore3() const{ 
    return testScore[2]; 
    } 
    float Student::GetScore4() const{ 
    return testScore[3]; 
    } 
    float Student::GetScore5() const{ 
    return testScore[4]; 
    } 
Student Student::operator=(const Student &rhs){ 
    lname = rhs.lname; 
    fname = rhs.fname; 
    for (int i = 0; i < 5; i++){ 
     testScore[i] = rhs.testScore[i]; 
    } 
    return *this; 
} 

std::ostream& operator<<(std::ostream& out, Student const& obj) 
{ 
out << "Lname: " << obj.Getlname() << "\n"; 
out << "fname: " << obj.Getfname() << "\n"; 
out << "Average: " << obj.GetAverage() << "\n"; 
out << "Grade: " << obj.GetLetterGrade() << "\n"; 

return out; 
} 

但是當我嘗試在主我得到串的錯誤...錯誤讀取字符使用它。

這裏是一個小我的主要

#include <iostream> 
#include <fstream> 
#include <string> 
#include <iomanip> 
#include "Project3Header.h" 
using namespace std; 


//Tyler Smith 
void StdInfo(Student array[], int size); 
Student * MakeStudentArray(int size); 
int main(){ 

ifstream inData; 
int size = 0; 
int highsize = 0; 
char data[65535]; 



inData.open("F:\\grade.dat"); 
if (!inData) 
{ 
    cout << "Error opening file.\n"; 
    cout << "Perhaps the file is not where indicated.\n"; 
    return 1; 
} 

while (inData.getline(data, 65535)) { 
    size++; 

} 
inData.close(); 
cout << size; 
Student s1; 
Student * ptArr; 
    ptArr = MakeStudentArray(size); 

    for (int i = 0; i < size; i++){ 
    ptArr[i]= s1; 
    } 

    StdInfo(ptArr,size); 
    /* for (int i = 0; i < size; i++){ 
     cout << ptArr[i].Getlname() << ptArr[i].Getfname(); //<< ptArr[i].Get() << endl; 
    }*/ 
    cout << ptArr[2].Getfname(); 
    return 0; 
    } 



    Student * MakeStudentArray(int size) 
    { 

    return new Student[size]; 
    } 

    void StdInfo(Student array[], int size){ 
    ifstream in; 
    in.open("F:\\grade.dat"); 
    string fname1,lname1=""; 
    int Score1, Score2, Score3, Score4, Score5=0; 

    for (int i = 0; i < size; i++) { 
     in >> lname1; 
     in >> fname1; 
     in >> Score1; 
     in >> Score2; 
     in >> Score3; 
     in >> Score4; 
     in >> Score5; 
     array[i].Setlname(lname1); 
     array[i].Setfname(fname1); 
     array[i].SetTestScore1(Score1); 
     array[i].SetTestScore2(Score2); 
     array[i].SetTestScore3(Score3); 
     array[i].SetTestScore4(Score4); 
     array[i].SetTestScore5(Score5); 
     array[i] = array[i + 1]; 
     //for (int j = 0; j < 5; j++) { 
     //in >> array[i].testScore[j]; 
     //} 
     } 

} 

當我嘗試這是行不通的。當我在調試模式下執行時,它會在超載操作符處停止並保持「讀取字符串的rhs錯誤字符串」

+1

什麼是錯誤的確切文本?它發生在哪條線上? 'MakeStudentArray'做正確的事情嗎? – doctorlove 2014-12-04 13:06:40

+1

賦值運算符的返回類型應該是'Student&''Student' – 2014-12-04 13:07:24

+0

@JonathanWakely它應該,但沒有所有文件的東西,我不明白我們如何得到任何錯誤,如「讀字符串」 - 我想知道這是未來從文件讀取。 – doctorlove 2014-12-04 13:13:31

回答

3

你的問題的essense是不是(非常規)賦值運算符,但MakeStudentArray功能。

我硬編碼的大小爲10,而不是從文件中讀取它,並用

Student * MakeStudentArray(int size) 
{ 
    return new Student[size]; 
} 

照顧打電話delete [] ptArr;我在主(擔心例外像我一樣)完成後,一切都好。

你的版本分配學生(也許遍佈整個堆),而不是一個數組。

如果我改變你的主貼到

for (int i = 0; i < size; i++){ 
    ptArr[i].operator= (s1); 
     //^------- you said 0, right? 
} 

問題代碼,然後我得到的一個問題。這是因爲for循環假定「數組」是連續的,但是你的函數新建了一個點數組,而不是學生數組,所以它走向天知道只知道它何時試圖循環「數組」。
使用我的建議版本應該可以解決這個問題,因爲它使用new[size]來分配一個數組,並且使它更易於刪除。


編輯1:
隨着main現在去休息,也許你繼續努力,在迴路設置ptArr[0]幾次,但隨後調用StdInfo會盡量走「陣列」,並給你錯誤。如果你想索引到一個數組中,使用[]必須是是連續的,所以分配函數MakeStudentInfo仍然是問題的原因。


EDIT2:
現在有更多的代碼,看看你的StdInfo功能。沒有額外的細節,它是這樣做的:

for (int i = 0; i < size; i++) { 
     //... 
     array[i] = array[i + 1]; 
    } 

你在這裏想達到什麼目的?它看起來像設置當前array[i]我們還沒有到。一旦i得到sizei+1將離開數組的末尾。
刪除該行將是一個好主意。

+0

好吧,我想我正在關注你。我已經做出了你所說的更正,現在似乎有不同的問題。我嘗試運行該程序,它出現說「consoleapplication.exe已停止工作」,它試圖找到一個Windows解決方案。然後,當我點擊調試器時,它會退出,說「Loaded'C:\ Windows \ SysWOW64 \ msvcr120d.dll'。找不到或打開PDB文件。」一遍又一遍地。雖然我會在你耳邊繼續問你。 @doctorlove – user3000195 2014-12-04 13:43:03

+0

如果您確定構建可以提供幫助的調試版本。我現在可以看到另一個問題,現在你有更多的代碼...編輯2。 – doctorlove 2014-12-04 13:45:16

+0

糟糕......那是我的不好。這條線來自我的頭腦,試圖弄清楚這一點。我打算刪除該行。現在,我似乎正在工作正常(手指交叉)....你一直是一個絕對驚人的幫助。我真的很欣賞這一點。如果我有任何其他問題,我知道誰轉向.....再次感謝 – user3000195 2014-12-04 13:56:16

1

賦值運算符應該返回對分配對象的引用,而不是副本。想想也使用複製&交換成語

Student& Student::operator=(const Student &rhs){ 
+0

確實如此,但是它確實會給(部分)描述的錯誤而不返回參考? – doctorlove 2014-12-04 13:15:40