2012-05-07 2 views
0

У меня есть MasterProcess, который является специализацией общей концепции процесса, а класс MasterDocument должен рассматривать несколько разных специализаций MasterProcess в возможном общем виде. Я использую Я использую virtual void Init() для достижения этой функциональности. Код выглядит следующим образом:конфликтный тип возвращаемого значения для Init()

#include <iostream> 
#include <utility> 
#include <string> 
#include <iostream> 
#include <sstream> 
#include <string> 
#include <algorithm> 
#include <fstream> 
#include <vector> 
#include <functional> 
#include <map> 
#include <stdexcept> 

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: 
virtual 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: 
    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 
{ 
    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() 
{ 
MasterDocument master_doc; 
cout << master_doc.myProcessList.size(); 

} 
} 

У меня возникают следующие ошибки при его компиляции.

**MD.cxx:81:11: error: ISO C++ forbids declaration of ‘Init’ with no type [-fpermissive] 
MD.cxx:138:11: error: ISO C++ forbids declaration of ‘Init’ with no type [-fpermissive] 
MD.cxx:138:6: error: conflicting return type specified for ‘virtual int ConcreteMasterProcess1::ConcreteMasterProcess2::Init()’ 
MD.cxx:57:15: error: overriding ‘virtual void BaseMasterProcess::Init()’ 
MD.cxx:582:1: error: expected ‘;’ after class definition 
MD.cxx:582:1: error: expected ‘}’ at end of input 
MD.cxx:81:6: error: conflicting return type specified for ‘virtual int ConcreteMasterProcess1::Init()’ 
MD.cxx:57:15: error: overriding ‘virtual void BaseMasterProcess::Init()’ 
MD.cxx: In member function ‘virtual double ConcreteMasterProcess1::getQuestionWeightage(int)’: 
MD.cxx:119:2: error: a function-definition is not allowed here before ‘{’ token 
MD.cxx: In member function ‘virtual double ConcreteMasterProcess1::ConcreteMasterProcess2::getQuestionWeightage(int)’: 
MD.cxx:192:2: error: a function-definition is not allowed here before ‘{’ token 
MD.cxx: At global scope: 
MD.cxx:580:1: error: expected unqualified-id at end of input** 
+0

Ваши отсутствующие закрывающие скобки '}' после ваших операторов switch и вашего доступа к частному члену 'MasterDocument' в' main'. –

ответ

2

Я думаю, вы пытаетесь предоставить конструктор для класса ConcreteMasterProcess2. Вы должны сделать это так:

class ConcreteMasterProcess2 : public BaseMasterProcess { 
public: 
    ConcreteMasterProcess2() { 
     /* ... */ 
    } 
}; 
+0

спасибо, что указал другой способ. Мне пришлось поместить тип возвращаемого типа в подклассы. Хотя объявление его как конструктора также работает. – Atif

2

Ваш метод Init в ConcreteMasterProcess1 не имеет указанного типа возврата. Возможно, вы смешиваете его с конструктором.

+0

Как указать тип возврата Init(). Все, что я хочу, это то, что метод Init() создает все ConcereteMasterProcess, когда объект MasterDocument создается в главном – Atif

+1

Поместите «void» перед Init(). Вы сделали это в BaseMasterProcess, но вы также должны сделать это для производных классов. –

+0

oops my bad. спасибо за указание глупой ошибки. Однако, когда я пытаюсь получить доступ к публичному члену BaseClass, я получаю эту ошибку. В функции-члена 'virtual double ConcreteMasterProcess1 :: getQuestionWeightage (int)': MD.cxx: 119: 2: ошибка: определение функции здесь недопустимо до '{' token – Atif

Смежные вопросы