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

C++ C++;:如何初始化以下std::shared_ptr构造函数数组,c++,class,pointers,shared-ptr,smart-pointers,C++,Class,Pointers,Shared Ptr,Smart Pointers,我有一个名为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_

我有一个名为
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; }
};
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()及其自定义删除技术的信息,我遇到了以下语句

std::shared_ptr<Base> Obj(new Derived[3], [](Derived* obj){ delete[] obj; });
std::shared_ptr Obj(新派生的[3],](派生的*Obj){delete[]Obj;});

std::shared_ptr Obj(新派生[3]={
{1,“一”},
{2,“两”},
{3,“三”}
}, 
[](派生*obj){delete[]obj;});
我的问题是:

  • 为什么我不能以以下方式初始化
    派生的
    类的构造函数或将值传递给该类的构造函数,即使我有一个可用于
    派生的
    类的自定义构造函数?还是我遗漏了什么
  • 如果是这样,初始化和访问的正确方法是什么 这样的
    派生类
    元素数组

  • 您可以这样调用构造函数:

    std::shared_ptr<Base> Obj{
        new Derived[3]{ {1,"One"}, {2,"Two"}, {3,"Three"} },
        [](Derived* obj){ delete[] obj; }
    };
    
    std::共享对象{
    新导出的[3]{{1,“1”},{2,“2”},{3,“3”},
    [](派生*obj){delete[]obj;}
    };
    
    是的,这很有效。所以这里我们不能像STL容器那样做,例如:
    std::map mp={{{1,“一”},{2,“二”},{3,“三”}。你能解释一下,为什么是这样吗?以及如何访问数组中的每个成员?可以,但在创建临时数组时不能。有关复制初始化,请参阅。您将如何处理生成的共享指针?你只能访问第一个数组元素。@KerrekSB:是的,这正是我所经历的。我甚至试着增加指针(就像我们在普通数组指针的情况下所做的那样),但那没有起作用。现在的问题是,当我创建如上所述的数组时,会发生什么?我可以访问这些(即
    派生[1]
    派生[2]
    )吗?数组没有什么特别之处。整个问题源于将派生指针强制转换为基指针,这会有效地丢弃有关环境数组的所有信息。
    std::shared_ptr<Base> Obj{
        new Derived[3]{ {1,"One"}, {2,"Two"}, {3,"Three"} },
        [](Derived* obj){ delete[] obj; }
    };