2017-06-12 104 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

啊,是的,我沒有想到用虛擬的,謝謝你! –

相關問題