2017-11-06 7 views
0

私は最初の別のクラスファイルに取り組んでいます。私は変更したくないドライバプログラムを与えられました。私はドライバから実行されるクラスファイルを作成します。C++でオブジェクトを作成して、クラスに引数を渡すにはどうすればよいですか?

#include <iostream> 
#include <iomanip> 
using namespace std; 

#include "Question.h" 

int main() 
{ 
    string q2Answers [] = {"China","India","Mexico","Australia"}; 
    Question q2("Which country is home to the Kangaroo?",q2Answers,'D'); 

    q2.display(); 
    cout << endl; 
} 

上記の単純化されたドライバは、引数を介して引数をクラスに渡しているようです。私のクラスヘッダファイルは次のように構築されています。

#ifndef QUESTION_H 
#define QUESTION_H 
#include <string> 
using namespace std; 

class Question 
{ 
    public: 
     void setStem(string newStem); 
     void setAnswers(string newAnswers[]); 
     void setKey(char newKey); 
     void display(); 
     string getStem(); 
     string getAnswer(int index); 
     char getKey(); 

    private: 
     string stem; 
     string answers[4]; 
     char key; 

}; 

#endif // QUESTION_H 

オブジェクトに渡された引数を使用してクラス内の関数を実行するにはどうすればよいですか?

Question q2("Which country is home to the Kangaroo?",q2Answers,'D'); 

は、これらの引数を関数にプッシュする方法はありません。これについての洞察は非常に高く評価されます。

はあなたが好き、右のヘッダファイルにそれを作ることができ、次のいずれか私が正しくあなたを理解している場合、あなたはコンストラクタを作る方法について

+1

http://www.geeksforgeeks.org/constructors-c/ – OldProgrammer

+1

これは、いわゆる「ドライバプログラム」の正確な表現であれば、[あなたに与えた人は誰でもC++で無能です](https:///stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice)、よりよいC++教師を見つけるべきです。 –

+0

'' namespace std'を使っていることがわからない場合は、C++のより良い把握が得られるまでそれを保持することをお勧めします。それが大きくて重大なプロジェクトでない限り。 –

答えて

1

を求めている(あなたの質問にコメントしてOldProgrammerのリンクを参照してください)そう:

Question(const std::string& theQuestion, 
     const std::string theOptions[], const char& correctAnswer) 
{ 
    this->stem = theQuestion; 
    for(int i=0; i<4; i++){ 
     this->answers[i] = theAnswers[i]; 
    } 
    this->key = correctAnswer; 
} 
~Question(){} 
//This is called the "Destructor", it is a function called when the object is destroyed 

(それは今非常に重要ではありませんので、あなたは、彼らが何を意味するのか分からない場合は、ちょうどcharとしてstringまたはconst char& -partとしてconst std::string& -partを想像することができます。)

それとも、そうのような独立した.cppファイルでそれを行うことができます。私たちはデストラクタを使用する理由

Question::Question(const std::string& theQuestion, 
     const std::string& theOptions[], const char& correctAnswer) 
{ 
    this->stem = theQuestion; 
    for(int i=0; i<4; i++){ 
     this->answers[i] = theAnswers[i]; 
    } 
    this->key = correctAnswer; 
} 
Question::~Question(){} 

あなたは尋ねるかもしれません。オブジェクトが削除される前に行う必要があることがあるからです。 たとえば、特定の情報を保存したり変更したり、オブジェクトを作成したときに割り当てたダイナミックメモリを解放したりする場合などがあります。そうしないと、メモリリークが発生します。これは悪いことです。

Question q2("Which country is home to the Kangaroo?",q2Answers,'D'); 

また、「過負荷」コンストラクタ、すなわち、あなたはそれの他のバージョンを作ることができますすることができます

その後、次のようなオブジェクトを作成/構築することができます。あなたは、コンストラクタのパラメータのみが問題だったことを想像たとえば:

Question(std::string q){ 
     this->stem = q; 
} 
Question(char c[]){ 
     this->stem = c; 
} 

を今、あなたは、オブジェクトに文字列や文字の配列のいずれかを渡すことができます。しかし、もしあなたが1つしか持っていなければ、もう一方を行うことはできません。したがって、最初のコンストラクタだけを持っていれば、まったく同じことをするために一連の文字を渡すことはできません。そして、あなたが好きなだけ多く作ることができますが、必ずしもそれが大量のコンストラクタを持っているという理由だけで、それが良いというわけではありません。

関連する問題