与智能指针和矢量C 的多态性有关的问题

Issue with polymorphism with smart pointers and vectors c++

本文关键字:多态性 问题 智能 指针      更新时间:2023-10-16

我当前正在尝试学习C ,并且在尝试创建一个矢量时遇到问题,该向量通过几个不同的对象迭代,这些对象都用智能指针从同一基础上继承。p>我解析文件并创建对象并根据解析的字符插入向量,但我一直遇到错误:

Error   C2664   'std::unique_ptr<Test *,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': cannot convert argument 1 from 'std::unique_ptr<Test2,std::default_delete<_Ty>>' to 'std::nullptr_t'"

代码如下:

class Test {
public:
    virtual ~Test(){}
    virtual int update() {}
};

class Test2 : public Test {
private:
    int a;
public:
    Test2() {
    }
    Test2(int n) {
        a = n;
    }
    int update() override {
        return a;
    }
};
class Test3 : public Test {
private:
    int a;
public:
    Test3() {
    }
    Test3(int n) {
        a = n;
    }
    int update() override {
        return a;
    }
};
class Test4 : public Test {
private:
    int a;
public:
    Test4() {
    }
    Test4(int n) {
        a = n;
    }
    int update() override {
        return a;
    }
};
class manager {
private:
    std::vector<std::unique_ptr<Test*>> vList;
    std::ifstream lvlFile;
public:
    std::string tmp;
    manager() {
    }
    ~manager() {
    }
    void init(const char *path) {
        lvlFile.open(path, 0);
        while (lvlFile.eof() != true) {
            std::getline(lvlFile, tmp);
            for (char& a : tmp) {
                switch (a) {
                    case 'w':
                        vList.emplace_back(std::make_unique<Test2>(2));
                        break;
                    case 'g':
                        vList.emplace_back(std::make_unique<Test3>(3));
                        break;
                }
            }
        }
    }
    void print() {
        for (auto& i : vList) {
            std::cout << (*i)->update() << std::endl;
        }
    }
};
manager *m;
int main() {
    m = new manager();
    m->init("lvl.txt");
    _getch();
}

也许我在这里误解了一些重要的事情,但是我一直在环顾四周,没有找到真正的答案,所以最欢迎任何指示!

std::vector<std::unique_ptr<Test*>>更改为 std::vector<std::unique_ptr<Test>>

std::unique_ptr<Test*>是指向指针的指针(Test**(。