2017-06-12 103 views
0

即时制作一个模拟考试的项目,我遇到了问题。我有一个基类“任务”,3个继承“任务”类的类。然后在新的类任务集合中,我必须创建一个数组,我将从“任务”中放入所有3个继承类的对象。另外,所有工作都必须在任务集合类中完成,而不是在主函数中完成。在另一个班级制作几个班级的对象数组

代码如下所示:

class Task 
{ 
    public: 
     string contents; 
}; 

class Task4Answ : public Task 
{ 
    public: 
     string a,b,c,d; 
    Task4Answ(string contents1,string a1,string b1,string c1,string d1) 
    { 
     contents=contents1; 
     a=a1; 
     b=b1; 
     c=c1; 
     d=d1; 
    } 
}; 

class TaskNumber : public Task 
{ 
    public: 
     int right; 
    TaskNumber(string contents1, int pop) 
    { 
     contents=contents1; 
     right=pop; 
    } 
}; 

class TaskString : public Task 
{ 
    private:; 
     string poprawna; 
    public: 
    ZadanieNumer(string tresc1,string pop) 
    { 
     contents=contents1; 
     poprawna=pop; 
    } 
}; 

class TaskCollection 
{ 
    // Here i need to make an array which contains the objects of 3 classes, and method which will put them into array 
}; 
+1

'std :: vector >'? (可能是虚拟析构函数来启用'dynamic_cast')(或'variant'而不是继承)。 – Jarod42

+0

哦,这对我来说看起来有点难,是否有可能以某种更简单的方式使用基类任务? –

+0

你想收藏什么? – Jarod42

回答

-1

我认为ZadanieNumer(string tresc1, string pop)是翻译错误,它应该是TaskString(string contents1, string pop)

现在,我不知道是什么问题,但鉴于你的定义,class TaskCollection可能是简单的:

class TaskCollection 
{ 
    private: 
     Task collection[3]; 

    public: 
     TaskCollection(Task4Answ task1, TaskNumber task2, TaskString task3) 
     { 
      collection[0] = task1; 
      collection[1] = task2; 
      collection[2] = task3; 
     } 
} 

我用这个主要功能测试:

int main(int argc, char *argv[]) 
{ 
    Task4Answ t1("contents", "a1", "b1", "c1", "d1"); 
    TaskNumber t2("contents", 2); 
    TaskString t3("contents", "3"); 

    TaskCollection tc(t1, t2, t3); 

    return 0; 
} 
+0

嘿谢谢你的回答,但事情是我需要初始化类中的所有东西,并且把对象放到数组中。 –

+0

好的。在TaskCollection构造函数中移动t1,t2,t3声明。例如。 TaskCollection(void){collection [0] = Task4Answ(“contents”,“a1”,“b1”,“c1”,“d1”);集合[1] = TaskNumber(“contents”,2);集合[2] = TaskString(“contents”,“3”); }' –

+0

非常感谢,那是我一直在寻找的东西! –

0

你可以这样做:

#include <iostream> 
#include <sstream> 
#include <vector> 
#include <memory> 

class Task 
{ 
    std::string content; 
public: 
    explicit Task(const std::string& title) : content{title} {} 
    virtual ~Task() = default; 

    virtual bool check(std::istream& is) const = 0; 

}; 

class TaskNumber : public Task 
{ 
    int value; 
public: 
    TaskNumber(const std::string& title, int value) : Task{title}, value{value} {} 

    bool check(std::istream& is) const override 
    { 
     int i; 
     is >> i; 
     return i == value; 
    } 

}; 

class TaskString : public Task 
{ 
    std::string value; 
public: 
    TaskString(const std::string& title, const std::string& s) : Task{title}, value{s} {} 

    bool check(std::istream& is) const override 
    { 
     std::string s; 
     is >> s; 
     return s == value; 
    } 
}; 

class TaskCollection 
{ 
public: 
    void addTask(std::unique_ptr<Task> task) { tasks.push_back(std::move(task)); } 

    void run(std::istream& is) { 
     for (auto& task : tasks) { 
      std::cout << (task->check(is) ? "Success\n" : "Failed\n"); 
     } 
    } 

private: 
    std::vector<std::unique_ptr<Task>> tasks; 
}; 

int main() 
{ 
    TaskCollection tasks; 

    tasks.addTask(std::make_unique<TaskString>("t1", "Hello")); 
    tasks.addTask(std::make_unique<TaskString>("t2", "world")); 
    tasks.addTask(std::make_unique<TaskNumber>("t3", 42)); 

    std::string s{"Hi world 42"}; 
    std::stringstream ss{s}; 
    tasks.run(ss); 
} 

Demo

您可以使用虚拟方法根据基本接口执行特定的作业。

+0

啊,是的,我没有想到用虚拟的,谢谢你! –

相关问题