【问题标题】:How to push_back a unique_ptr in the vector of a derived class如何在派生类的向量中 push_back 一个 unique_ptr
【发布时间】:2020-01-08 22:24:55
【问题描述】:

我有一个复制 linux shell 命令(ls、mkdir 等)的任务,所以我使用的是通用树结构。基本上,目录类有一个指向基类(文件)或另一个派生类(目录)的指针向量。每当我尝试 push_back 一个指向新目录的唯一指针时,都会出现以下错误。

/usr/include/c++/8/ext/new_allocator.h:136:4: error: no matching function 
for call to ‘std::unique_ptr<FileData*>::unique_ptr(std::unique_ptr<Directory,
std::default_delete<Directory> >)’
 { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

这是我的代码

#include "FileData.h"
#include <vector>
#include <cctype>
#include <memory>

class Directory : public FileData
{
    private:
        Directory * parent;
        std::vector<std::unique_ptr<FileData*>> files;
        void eraseString(std::string & mainString, 
                const std::string & stringToErase);
        int amountOfChar(const std::string & check);
    public:
        Directory();
        Directory(Directory * par);
        ~Directory();
        Directory(const Directory & x);
        void listComputerFiles(std::string input);
        void changeDirectory(std::string input);
        void makeDirectory(std::string input);
        void removeDirectory(std::string input);
        void makeFile(std::string input);
        void removeFile(std::string input);
        void printCurrentDirectory();
};

class FileData
{
    friend class Directory;
    protected:
        std::string name;
        std::string restrictions;
        std::string timestamp;
        std::string owner;
        std::string group;
        int dataSize;
        int numberOfItems;
    public:
        FileData();
        FileData(std::string nameOfFile, std::string restrict, std::string time, 
            std::string own, int size, int itemNumber);
        virtual ~FileData();
};

这是错误发生的地方

files.emplace_back(std::make_unique<Directory>(new Directory(*this)));

我尝试了许多来自其他有类似问题的用户的不同组合,但无济于事,包括使用 shared_ptr。正如您可能知道的那样,我没有使用智能指针的经验,但感觉在这种情况下使用它们很有帮助,因为要清理嵌套目录让人望而生畏。

【问题讨论】:

    标签: c++11 inheritance smart-pointers


    【解决方案1】:

    unique_ptr&lt;T&gt; 是 T* 原始指针的包装器。

    当您编写unique_ptr&lt;FileData*&gt; 时,它会将FileData** 作为内部指针。这不是你想要的。

    只写:

    std::vector<std::unique_ptr<FileData>> files;
    

    当您使用 emplace 系列函数时,您应该传递将用于构造 unique_ptr 实例的参数:

    files.emplace_back( new Directory(*this) );
    

    或

    files.emplace_back( new Directory() );
    

    unique_ptr 的完全构造对象是push_back 方法所必需的:

    files.push_back(std::make_unique<Directory>(new Directory(*this)));
    

    【讨论】:

    • 我现在收到一个新错误,在抛出 'std::length_error' what(): basic_string::_M_create Aborted (core dumped) 的实例后终止调用
    • 编译时的错误,和什么运行时错误不一样。所以现在你的代码编译好了。当你得到运行时错误时,找出你得到它的最好方法是使用调试器。或者您可以使用 MCVE 提出另一个问题。
    • 我使用了调试器,它只是转到我的 Directory 类,然后是我的 FileData 类,然后发生错误。也许与构造函数有关?
    猜你喜欢
    • 2014-02-16
    • 2017-03-23
    • 2012-07-17
    • 2019-05-13
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2021-02-18
    相关资源
    最近更新 更多