2013-03-27 1 views
0

Question 클래스에 대한 내 정의와 구현을 모두 포함 시켰습니다. 첫 번째는 헤더 파일이고 두 번째는 cpp 파일입니다.공사 후에도 데이터 회원이 비어 있습니까?

문제가있는 위치를 표시하기 위해 의견을 달았습니다. 몇 가지 이유로 생성자에서 나는 괜찮아요,하지만 괜찮아요.하지만 getQuestionText 함수 아래서 이것을하려고 할 때, 단지 빈 문자열을 출력합니까? 어떤 도움을 주시면 감사하겠습니다 !! 감사! 내가 메인이를 호출 할 때

#include <string> 
#include <vector> 
#include <iostream> 

using namespace std; 

#ifndef QUESTION_H 
#define QUESTION_H 

class Question{ 
public: 
    Question(int thePointValue, int theChapterNumber, \ 
     string theQuestionText); 
    int getPointValue() const; 
    int getChapterNumber() const; 
    string getQuestionText() const; 
    virtual void writeQuestion(ostream& outfile) const; 
    virtual void writeKey(ostream& outfile) const; 

private: 
    int pointValue; 
    int chapterNumber; 
    string questionText; 

    void writePointValue(ostream& outfile) const; 
}; 




#endif 





#include "Question.h" 

Question::Question(int thePointValue, int theChapterNumber, \ 
     string theQuestionText) 
{ 
    pointValue = thePointValue; 
    chapterNumber = theChapterNumber; 
    questionText = theQuestionText; 

     //HERE THIS WORKS PERFECTLY 
     cout << questionText << endl; 
} 

int Question::getPointValue() const 
{ 
    return pointValue; 
} 

int Question::getChapterNumber() const 
{ 
    return chapterNumber; 
} 

string Question::getQuestionText() const 
{ 
     //THIS IS THE PROBLEM. HERE IT OUPUTS AN EMPTY STRING NO MATTER WHAT! 
     cout << questionText << endl; 
    return questionText; 
} 

void Question::writeQuestion(ostream& outfile) const 
{ 
    writePointValue(outfile); 
    outfile << questionText << endl; 
} 

void Question::writeKey(ostream& outfile) const 
{ 
    writePointValue(outfile); 
    outfile << endl; 
} 

void Question::writePointValue(ostream& outfile) const 
{ 
    string pt_noun; 

    if (pointValue == 1) 
     pt_noun = "point"; 
    else 
     pt_noun = "points"; 

    outfile << "(" << pointValue << " " << pt_noun << ") "; 
} 

vector<Question *> QuestionsList(string filename, int min, int max) 
{ 
vector<Question *> QuestionList; 

string line; 
vector<string> text; 
ifstream in_file; 
in_file.open(filename.c_str()); 
while (getline(in_file, line)) 
{ 
    text.push_back(line); 
} 

string type; 
for(int i = 0; i < text.size(); i ++) 
{ 
    int num = text[i].find('@'); 
    type = text[i].substr(0, num); 
    if (type == "multiple") 
    { 
     MultipleChoiceQuestion myq = matchup(text[i]); 
     MultipleChoiceQuestion* myptr = &myq; 
     if (myq.getChapterNumber() >= min && myq.getChapterNumber() <= max) 
     { 
      QuestionList.push_back(myptr); 
     } 
    } 
    if (type == "short") 
    { 
     ShortAnswerQuestion myq = SAmatchup(text[i]); 
     ShortAnswerQuestion* myptr = &myq; 
     if (myq.getChapterNumber() >= min && myq.getChapterNumber() <= max) 
     { 
      QuestionList.push_back(myptr); 
     } 
    } 
    if (type == "long") 
    { 
     LongAnswerQuestion myq = LAmatchup(text[i]); 
     LongAnswerQuestion* myptr = &myq; 
     if (myq.getChapterNumber() >= min && myq.getChapterNumber() <= max) 
     { 
      QuestionList.push_back(myptr); 
     } 
    } 
    if (type == "code") 
    { 
     CodeQuestion myq = CODEmatchup(text[i]); 
     CodeQuestion* myptr = &myq; 
     if (myq.getChapterNumber() >= min && myq.getChapterNumber() <= max) 
     { 
      QuestionList.push_back(myptr); 
     } 
    } 
    cout << QuestionList[QuestionList.size()-1]->getQuestionText() << endl; 
} 
for (int i = 0; i < QuestionList.size(); i ++) 
{ 
    int numm = QuestionList.size(); 
    cout << QuestionList[numm-1]->getQuestionText() << endl; 
} 
return QuestionList; 

}

다음 코드는

vector<Question *> list = QuestionsList(pool_filename, min_chapter, max_chapter); 
cout << list[0]->getQuestionText() << endl; 
+0

메인 오른쪽의 어느 시점에서 문자열을 초기화하고 있습니까? – RyPope

+0

'Question' 객체가 사용되는 시점에서 어떻게 초기화되는지 보여줍니다. 인수를 취하는 생성자를 호출하는 것이지 기본값 (빈)이 아닌 생성자를 호출하는 것입니다. 맞습니까? – chr

+0

우리는 [sscce] (http://sscce.org)를 볼 수 있습니까? – chris

답변

1

당신은 (선언 코드에서 여러 번, 로컬 객체와 QuestionList 벡터에 자신의 포인터를 저장하는 나누기 함수에 의해 반환 된) 함수 블록의 끝에는 dangling pointers이 포함됩니다. 당신이 (당신이 당신이 절대적으로 강제하지 않는 한 그렇게하지 않는 것이 좋습니다, 심지어 그 경우에 표준 라이브러리에서 제공하는 smart pointers 중 하나를 사용) 또는 직접 개체를 저장 dynamic memory allocation를 사용할 수 있습니다이 시점에서

MultipleChoiceQuestion myq = matchup(text[i]); // < local object 
MultipleChoiceQuestion* myptr = &myq; // < pointer to local object 

QuestionList.push_back(myptr); // < push back into vector 

벡터 내부.

관련 문제