2016-12-25 11 views
-3

私はクイズの銀行ゲームを作りたいと思っていました....私は情報を格納し、それをベクトルに戻すtxtファイルを持っていますが、私の主な問題は、オブジェクトのベクトルにこのポインタを使ってgetメソッドを出力する方法ですか? これは、ここに私のコード全体オブジェクトのベクトルの要素をどのように出力できますか?

#include <iostream> 
#include <string> 
#include <fstream> 
#include <iostream> 
#include <string> 
#include <vector> 
#include <cstdlib> 
using namespace std; 
class question 
{ 
private : 
    string ques ; 
    string answer; 
    int point ; 
public : 
    question(string ques = "",string answer = "",int point = 0):ques(ques),answer(answer),point(point){} 

    virtual string getAnswer() = 0; 
    virtual string getQuestion() = 0; 
    virtual int getPoint() = 0; 



}; 

class SAquestion : public question 
{ 
private : 
    string ques ; 
    string answer; 
    int point ; 
public : 
SAquestion(string ques = "",string answer = "",int point = 0):ques(ques),answer(answer),point(point){} 
    string getAnswer() {return answer;} 
    string getQuestion(){return ques ;} 
    int getPoint() {return point ;} 



}; 
class MCquestion : public question 
{ 
private : 
    string ques ; 
    string answer; 
    int point ; 
public : 
MCquestion(string ques = "",string answer = "",int point = 0):ques(ques),answer(answer),point(point){} 
    string getAnswer() {return answer;} 
    string getQuestion(){return ques ;} 
    int getPoint() {return point ;} 



}; 

class TFquestion : public question 
{ 
private : 
    string ques ; 
    string answer; 
    int point ; 
public : 
TFquestion(string ques = "",string answer = "",int point = 0):ques(ques),answer(answer),point(point){} 
    string getAnswer() {return answer;} 
    string getQuestion(){return ques ;} 
    int getPoint() {return point ;} 



}; 


void readDataByDelimiter(const char* filename, vector< SAquestion>*SHORTQ) { 
    string line; 
    ifstream ifs(filename); 
    if (ifs.is_open()) { 
     cout << "Reading data...\n"; 
     int c = 0; 
     while (getline (ifs,line) && (*line.c_str() != '\0')) { 
      string delimiter = ","; 
      size_t pos = 0; 
      string* token = new string[5]; 
      int f = -1; 
      while ((pos = line.find(delimiter)) != string::npos) { 
       token[++f] = line.substr(0, pos); 
       cout << " " << token[f] << " | " ; 
       line.erase(0, pos + delimiter.length()); 
      } 
      token[++f] = line; 
      cout << token[f] << endl;  // last item in string 
      c++; 

      // push to vector (numerical data converted to int) 
      SAquestion b(token[1], token[2], atoi(token[3].c_str())); 
      SHORTQ->push_back(b); 
     } 
     cout << c << " row(s) read." << endl << endl; 
     ifs.close(); 
    } 
    else 
     cout << "Unable to open file"; 
} 

    enter code here 


int main() 
{ 
    vector<SAquestion> *s = new vector<SAquestion>(); 
    readDataByDelimiter("SHORQ.txt", s); 
cout <<s[0]->getAnswer(); 


} 

- List item 
+2

ようこそスタックオーバーフロー。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

+1

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+2

なぜあなたは動的に 'ベクトル'を割り当てていますか? C++はJavaではなくC#ではないので、あなたはする必要はありません。あなたのメソッドへの参照渡し。 –

答えて

1

あるvectorを印刷するためのコードです:

void Print_Vector(const std::vector<SAquestion>& v) 
{ 
    std::vector<SAquestion>::const_iter iter; 
    const std::vector<SAquestion>::const_iter end_iter = v.end(); 
    for (iter = v.begin(); iter != end_iter; ++iter) 
    { 
    cout << *iter << "\n"; 
    } 
} 

上記のコードはvectorの各要素を訪問するイテレータを使用しています。印刷はvectorの内容を変更しないので、vector定数参照と定数イテレータが使用されます。

注:この機能を使用するには、SAquestionアイテムを印刷するためにoperator <<をオーバーロードする必要があります。

注:を参照すると、が渡されます。ポインタを使用する必要はありません。

編集1:operator<<
をオーバーロードすると、オブジェクトを印刷するあなたの視点を変更し、オブジェクトがそのメンバーを印刷していると。 1つの便利な方法は、operator>>をオーバーロードすることです:

class SAquestion 
{ 
//... 
    public: 
    friend std::ostream& operator<<(std::ostream& output, const SAquestion& saq); 
}; 
std::ostream& operator<<(std::ostream& output, const SAquestion& saq) 
{ 
    output << "Q: " << saq.ques << "\n"; 
    output << "A: " << saq.answer << "\n"; 
    output << "\n"; 
    return output; 
} 

あなたはfriendキーワードはoperator<<機能が直接SAquestionメンバーにアクセスすることができますので、getAnswer()メソッドを使用する必要はありません。

+0

だから私は例のように1つのメソッドを取得したい場合 s [0] .getAnswer()どのように私はこのコードでそれを行うことができますありがとう:D –

+0

なぜ ' –

+0

@ Cheersandhth.-Alf:私は古いコンパイラを使っていて、範囲ベースの 'for'を使用していないので、単純に範囲ベースの* forを使用しません:-( –

関連する問題