【问题标题】:Making an array of objects of few classes in another class在另一个类中制作几个类的对象数组
【发布时间】:2017-06-12 20:34:41
【问题描述】:

我正在制作一个模拟考试的项目,我遇到了这个问题。我有一个基类“任务”和 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
};

【问题讨论】:

  • std::vector<std::unique_ptr<Task>> ? (并且可能是启用dynamic_cast 的虚拟析构函数)(或variant 而不是继承)。
  • 哦,这对我来说有点难,有没有可能我可以用更简单的方式使用基类 Task?
  • 你想用你的收藏做什么?
  • 我想从中抽取任务的随机测试,从用户那里得到答案,并检查它们是否正确。
  • @DarekD -- 哦,这对我来说有点难 -- 在某些时候你需要学习 C++。 std::vector<Task*>std::array<Task*, 3> 并从那里毕业以使用 std::vector<std::unique_ptr<Task>>std::array<std::unique_ptr<Task>,3>

标签: c++ arrays object


【解决方案1】:

你可以这样做:

#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

您使用虚拟方法根据基本接口完成特定工作。

【讨论】:

    【解决方案2】:

    我认为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;
            }
    }
    

    我用这个main函数来测试:

    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;
    }
    

    【讨论】:

    • 嘿,感谢您的回答,但问题是我需要初始化类中的所有内容,并将对象放入数组中。
    • 好的。在 TaskCollection 构造函数中移动 t1、t2、t3 声明。例如。 TaskCollection(void) { collection[0] = Task4Answ("contents", "a1", "b1", "c1", "d1"); collection[1] = TaskNumber("contents", 2); collection[2] = TaskString("contents", "3"); }
    • 非常感谢,这正是我一直在寻找的东西!
    • @DarekD 这不太可能。这是行不通的,除非您想丢弃派生类部分。
    • 哦,我认为这将是一个快速简单的解决方案,因为我必须做一些事情来在这个类中创建对象,并将它们分配给数组。
    猜你喜欢
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多