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<>()
及其自定义删除技术的更多信息,并且遇到了以下声明。
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<int, std::string> mp = 1,"One", 2,"Two", 3,"Three" ;
。您能否也解释一下,为什么会这样?以及如何访问数组中的每个成员?
可以,但在创建临时文件时不行。请参阅syntax 了解复制初始化。以上是关于C++:如何初始化以下 std::shared_ptr 构造函数数组的主要内容,如果未能解决你的问题,请参考以下文章
C++:如何初始化以下 std::shared_ptr 构造函数数组