C++:如何初始化以下 std::shared_ptr 构造函数数组

Posted

技术标签:

【中文标题】C++:如何初始化以下 std::shared_ptr 构造函数数组【英文标题】:C++: How to initialize following std::shared_ptr constructor array 【发布时间】:2018-04-08 14:02:42 【问题描述】:

我有一个名为 Base 的抽象类,我从中派生了一个类 (Derived),如下所示:

#include <iostream>
#include <string>
#include <memory>

class Base

public:
    virtual void printClass()const = 0;
    virtual ~Base()
;

class Derived: public Base

private:
    int m_var1;
    std::string m_var2;
public:
    Derived() = default;
    Derived(const int& v1, const std::string& v2)
        :m_var1(v1), m_var2(v2)
                

    void printClass()const override
    
        std::cout << "Derived Class with\t";
        std::cout << m_var1 << " " << m_var2 << std::endl;
    
    ~Derived() std::cout << "Derived destroyed" << std::endl; 
;

现在在main() 中使用多态我可以声明如下:

int main()

    std::shared_ptr<Base> Obj[3];
    Obj[0] = std::make_shared<Derived>(1,"One");
    Obj[1] = std::make_shared<Derived>(2,"Two");
    Obj[2] = std::make_shared<Derived>(3,"Three");

    for(const auto& it: Obj)
        it->printClass();
    return 0;

但是,我目前正在尝试了解有关 std::shared_ptr&lt;&gt;() 及其自定义删除技术的更多信息,并且遇到了以下声明。

std::shared_ptr<Base> Obj(new Derived[3], [](Derived* obj) delete[] obj; );

std::shared_ptr<Base> Obj(new Derived[3] =  
                                              1,"One", 
                                              2,"Two", 
                                              3,"Three" 
                                           , 
                                           [](Derived* obj) delete[] obj; );

我的问题是:

    为什么我不能以以下方式初始化或传递值给Derived 类的构造函数,即使我有一个可用于derived 类的服装定义构造函数?还是我错过了什么? 如果是这样,初始化和访问的正确方法是什么 这样的derived class 元素数组?

【问题讨论】:

你会用得到的共享指针做什么?除了第一个数组元素之外,您无法访问任何其他元素。 @KerrekSB:是的,这正是我所经历的。我什至尝试增加指针(就像我们在普通数组指针情况下所做的那样),但这不起作用。现在的问题是当我创建一个像上面这样的数组时会发生什么?我可以访问那些(即Derived[1]Derived[2])吗? 数组没有什么特别之处。整个问题来自于将 Derived 指针转换为 Base 指针,这有效地丢弃了有关环境数组的所有信息。 【参考方案1】:

你可以这样调用构造函数:

std::shared_ptr<Base> Obj
    new Derived[3] 1,"One", 2,"Two", 3,"Three" ,
    [](Derived* obj) delete[] obj; 
;

【讨论】:

是的,行得通。所以在这里我们不能像 STL 容器那样做,例如:std::map&lt;int, std::string&gt; mp = 1,"One", 2,"Two", 3,"Three" ;。您能否也解释一下,为什么会这样?以及如何访问数组中的每个成员? 可以,但在创建临时文件时不行。请参阅syntax 了解复制初始化

以上是关于C++:如何初始化以下 std::shared_ptr 构造函数数组的主要内容,如果未能解决你的问题,请参考以下文章

C++:如何初始化以下 std::shared_ptr 构造函数数组

如何在 C++ 中部分初始化一组 C 结构?

如何检查对象是不是已在 C++ 中初始化/创建?

如何在构造函数中初始化 C++ 对象成员变量?

如何在 C++ 子类的构造函数中初始化超类的 const 成员变量?

如何验证 C++ 构造函数中的输入参数?