带有智能指针和向量c ++的多态性问题

时间:2018-03-28 12:07:21

标签: c++ inheritance vector smart-pointers

我目前正在尝试学习c ++,并且在尝试创建一个迭代几个不同对象的向量时遇到问题,这些对象都使用智能指针从相同的基类继承。

我解析一个文件并创建对象并根据解析的字符将它们插入到向量中但我不断收到错误:

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

也许我误解了一些关键的东西,但我一直在四处寻找并找不到真正的答案,所以任何对此的指示都会受到欢迎!

1 个答案:

答案 0 :(得分:1)

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

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