C++ 在另一个类中生成几个类的对象数组

C++ 在另一个类中生成几个类的对象数组,c++,arrays,object,C++,Arrays,Object,我正在做一个模拟考试的项目,我遇到了这个问题。我有一个基类任务和任务类的3个继承类。然后在新类任务集合中,我必须创建一个数组,在其中我将放置来自任务的所有3个继承类的对象。此外,所有这些都必须在任务集合类中完成,而不是在主函数中完成 代码如下所示: class Task { public: string contents; }; class Task4Answ : public Task { public: string a,b,c,d;

我正在做一个模拟考试的项目,我遇到了这个问题。我有一个基类任务和任务类的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
};
我假设ZadanieNumerstring tresc1,字符串pop是一个翻译错误,它应该是TaskStringstring contents1,字符串pop

现在我不确定问题出在哪里,但根据您的定义,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;
}

你可以这样做:

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

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

std::vector?可能是虚拟析构函数来启用dynamic_cast或variant而不是继承。哦,这对我来说有点困难,是否有可能以更简单的方式使用基类任务?你想对你的集合做什么?我想从中随机抽取任务测试,从用户那里得到答案,看看他们是否正确。“DaRKD -哦,这对我来说有点困难——在某个时候,你需要学习C++。std::vector或std::array,然后开始使用std::vector或std::array。嘿,谢谢你的回答,但问题是我需要初始化类中的所有内容,然后将对象放入数组。好的。在TaskCollection构造函数中移动t1、t2、t3声明。TaskCollectionvoid{collection[0]=Task4Answcontents,a1,b1,c1,d1;collection[1]=TaskNumbercontents,2;collection[2]=TaskStringcontents,3;}非常感谢,这是我一直在寻找的东西@但这不太可能。这是不可能的,除非你想扔掉派生类部分。Ohh认为这将是一个快速简单的解决方案,因为我必须在这个类中创建对象,并将它们分配给数组。