5

さまざまなプロセスを含むMasterdocumentというクラスがあります。各プロセスには、異なる数の質問と、質問ごとに可能な回答オプションが含まれています。各回答オプションの重みもドキュメントに記載されています。ユーザーが提供する回答に基づいて、マスタードキュメントが参照され、ユーザーの回答がスコアリングされます。サンプルコードは次のようになります。

Class Masterdocument {
vector <MasterProcess>;
}; 
Class MasterProcess1 { 
id = 10;
num of questions = 2;
question1;
answer1option1;
answer1option2;
question1Weightage;

question2;
answer2option1;
answer2option2;
question2weightage;

//constructor
MasterProcess1(){
question1 =1;
answer1option1 =1;
answer1 option2 = 2;
question1weightage = 0.1

question2 =2;
answer2option1 = 1;
answer2option2 = 2;
question2weightage = 0.2;
}
};

Class MasterProcess2 {
id  =11; 
num of questions = 3;
question1;
answer1option1;
answer1option2;
question1Weightage;

question2;
answer2option1;
answer2option2;
answer2option3;
question2weightage;

question3;
answer3option1;
answer3option2;
question3weightage;

//constructor
MasterProcess2(){
question1 =1;
answer1option1 =1;
answer1 option2 = 2;
question1weightage = 0.2

question2 =2;
answer2option1 = 1;
answer2option2 = 2;
answer2option3 = 3;
question2weightage = 0.3;

question3 = 3;
answer3option1 = 1;
answer3option2 = 2;
question3weightage = 0.4
}
};

MasterDocumentとすべてのMasterProcessesは定数です。値は変更されません。ただし、質問の数(および各質問の回答オプション)は、プロセスごとに異なります。コンストラクターを使用して初期化できます。しかし、すべてのMasterProcessは異なる名前(MasterProcess1、MasterProcess2など)を持っているので、MasterDocumentのベクターにそれらを追加するにはどうすればよいですか。したがって、MasterDocumentにベクトルを含めることはできません。

すべてのプロセスに同じ名前を使用する場合(それぞれをMasterProcessと呼びます)、質問の数が異なり、次に2番目のmasterProcessがあるため、最初のMasterProcessを呼び出すコンストラクターをどのように知ることができますか。

マスタードキュメントは変更されないため、値をハードコーディングできますが、値を初期化するにはどうすればよいですか。すべてのプロセスを単一のMasterDocumentに入れて、すべてのプロセスのすべての質問/回答を含む巨大なコンストラクターを作成できますが、それは見栄えがよくありません。

各プロセスをMasterProcessとして呼び出し、コンストラクターでプロセスのID(MasterProcess(id)など)を渡すことができますが、MasterProcess(10)がファーストクラスのコンストラクターを呼び出し、MasterProcess(11)がコンストラクターを呼び出すように指示するにはどうすればよいですか?セカンドクラスの。

@ Heisenbug

私はあなたの先導に従い、このコードを思いついた

#include <iostream>
#include <utility>
#include <string>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

class BaseMasterProcess {

protected:

int processID;  
int num_of_Questions;  
double min_Threshold_Score_for_Process;  
double total_Process_Score;  
double overall_Audit_Value;
int question;
pair <int,double> answer;

//define all the variable used in any sub-class 
int question1;
int question2;
int question3;
int question4;
int question5;
double question1_Weightage;
double question2_Weightage;
double question3_Weightage;
double question4_Weightage;
double question5_Weightage;
int passing_Score;
pair <int,double> answer1_Option1;  
pair <int,double> answer1_Option2; 
pair <int,double> answer1_Option3;
pair <int,double> answer2_Option1;  
pair <int,double> answer2_Option2; 
pair <int,double> answer2_Option3;
pair <int,double> answer3_Option1;  
pair <int,double> answer3_Option2; 
pair <int,double> answer3_Option3;
pair <int,double> answer4_Option1;  
pair <int,double> answer4_Option2; 
pair <int,double> answer4_Option3;
pair <int,double> answer5_Option1;  
pair <int,double> answer5_Option2; 
pair <int,double> answer5_Option3;

public:
abstract void Init();
virtual double getQuestionWeightage(int ques) = 0;
virtual double getAnswerScore(int ques, int ans) = 0; 
int getNumQuestions()
{
    return num_of_Questions;
}
int getProcesssID()
{
    return processID;
}
double getMinThresholdScore()
{
    return min_Threshold_Score_for_Process;
}
double overallAuditValue()
{
    return overall_Audit_Value; 
}
};
class ConcreteMasterProcess1 : public BaseMasterProcess
{
public:
    void Init()
    {
processID = 10; 
num_of_Questions = 3;  
passing_Score = 70;  
min_Threshold_Score_for_Process = 0.7; 
overall_Audit_Value = 0.1;

question1 = 1; 
question1_Weightage = 0.3;  
answer1_Option1 = make_pair (1,0.3); 
answer1_Option2 = make_pair (2,0.0);

question2 = 2; 
question2_Weightage = 0.3; 
answer2_Option1 = make_pair (1,0.3); 
answer2_Option2 = make_pair (2,0.0);


question3 = 3;
question3_Weightage = 0.4; 
answer3_Option1 = make_pair (1,0.4); 
answer3_Option2 = make_pair (2,0.0);
}

double getQuestionWeightage(int ques)
{
switch (ques)
{
    case 1:
        return question1_Weightage;
    case 2:
        return question2_Weightage;
    case 3:
        return question3_Weightage;
}
    }
double getAnswerScore(int ques, int ans) 
{
    if (ques == question1 && ans == answer1_Option1.first)
        return answer1_Option1.second;
    else if (ques == question1 && ans == answer1_Option2.first)
        return answer1_Option2.second; 
    else if (ques == question2 && ans == answer2_Option1.first)
        return answer2_Option1.second;
    else if (ques == question2 && ans == answer2_Option2.first)
        return answer2_Option2.second;
    else if (ques == question3 && ans == answer3_Option1.first)
        return answer3_Option1.second;
    else 
        return answer3_Option2.second;

}   
};
class ConcreteMasterProcess2 : public BaseMasterProcess
{
    void Init()
    {
processID = 11; 
num_of_Questions = 4;  
passing_Score = 70;  
min_Threshold_Score_for_Process = 0.75; 
overall_Audit_Value = 0.1;

question1 = 1; 
question1_Weightage = 0.25;  
answer1_Option1 = make_pair (1,0.25); 
answer1_Option2 = make_pair (2,0.0);

question2 = 2; 
question2_Weightage = 0.25; 
answer2_Option1 = make_pair (1,0.25); 
answer2_Option2 = make_pair (2,0.0);
answer2_Option3 = make_pair (3,0.15);

question3 = 3;
question3_Weightage = 0.25; 
answer3_Option1 = make_pair (1,0.25); 
answer3_Option2 = make_pair (2,0.0);

question4 = 4;
question4_Weightage = 0.2; 
answer4_Option1 = make_pair (1,0.2); 
answer4_Option2 = make_pair (2,0.0);

question5 = 5;
question5_Weightage = 0.2; 
answer5_Option1 = make_pair (1,0.2); 
answer5_Option2 = make_pair (2,0.0);
}

double getQuestionWeightage(int ques)
{
switch (ques)
{
    case 1:
        return question1_Weightage;
        break;
    case 2:
        return question2_Weightage;
        break;
    case 3:
        return question3_Weightage;
        break;
    case 4:
        return question4_Weightage;
        break;
}
    }
double getAnswerScore(int ques, int ans) 
{
    if (ques == question1 && ans == answer1_Option1.first)
        return answer1_Option1.second;
    else if (ques == question1 && ans == answer1_Option2.first)
        return answer1_Option2.second; 
    else if (ques == question2 && ans == answer2_Option1.first)
        return answer2_Option1.second;
    else if (ques == question2 && ans == answer2_Option2.first)
        return answer2_Option2.second;
    else if (ques == question2 && ans == answer2_Option3.first)
        return answer2_Option3.second;
    else if (ques == question3 && ans == answer3_Option1.first)
        return answer3_Option1.second;
    else if (ques == question3 && ans == answer3_Option2.first)
        return answer3_Option2.second;
    else if (ques == question4 && ans == answer4_Option1.first)
        return answer4_Option1.second;
    else
        return answer4_Option2.second;

}   
};
class MasterDocument
{
std::vector<BaseMasterProcess*> myProcessList;
void AddProcess(BaseMasterProcess* iProcess)
{
myProcessList.push_back(iProcess);
}
void foo()
{
//myProcessList[...]->Method1(); //do something without knowing which specific concrete    class the process belongs to..
}
};

int main ()
{
BaseMasterProcess bmp; 
ConcreteMasterProcess6 p6;  
MD master_doc;
master_doc.addProcess(bmp); // gives ERROR
    master_doc.addProcess(p6); // gives ERROR
master_doc.foo();

}

次のエラーが発生します。

Init()について-> ISO C ++は、型のない'Init'の宣言を禁止します[-fpermissive] 編集:void Init()に変更->解決済み 関数getQuestionWeightage(int)->メンバー関数について'virtual double ConcreteMasterProcess1 :: getQuestionWeightage (int)':エラー:' {'トークンの前に関数定義は許可されていません 編集:スイッチの最後に}がありませんでした->解決済み main()について->入力の最後に期待される'}' -入力の最後のid 編集:mian()に余分な}があります->解決済み

main()に表示されるエラーを解決するにはどうすればよいですか。私がやりたいのは、MasterDocumentを作成し、myProcssListに2つの具象プロセスを含めることだけです???

4

2 に答える 2

1

shared_ptr を使用する別のオプションは次のとおりです。

struct Answer {
int whatever;
}

struct Process {
int whatever;
std::vector<std::shared_ptr<Answer> > answers;
};

struct Document {
Document();
std::vector<std::shared_ptr<Process> > processes;
};
int main (){
Document::Document()
{
// Make some processes
for (int i = 0; i < 5; i++) {
std::shared_ptr<Process> foo = std::shared_ptr<Process>();
foo->whatever = i;
processes.push_back(foo);
}
}

}

于 2012-05-07T21:27:52.060 に答える
1

このような構造を使用します。それを打破する

MasterDocument{ 
vector <Process> 
... 
}; 
Process{ 
vector<Question>; 
... 
}; 
Question{ 
vector<Answer>: 
... 
}; 
Answer{ 
map<int answer, int score>;  
};
于 2012-05-07T21:21:49.787 に答える