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