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

标签 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_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; });

我的问题是:

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

最佳答案

你可以这样调用构造器:

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

关于C++:如何初始化以下 std::shared_ptr 构造函数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49718670/

相关文章:

当正在读取的文件中的变量等于用户输入时,C++ 为实例创建计数器的方法

c++ - 如何从此类实例的指针使用类的方法?

c++ - 更改局部变量的地址

C - 传递 'send_data' 的参数 1 从整数生成指针而不进行强制转换

C : uninitialized char pointer and print out the address

C++ 返回 vector

c++ - QML,Qt 4.8 : How to enable openGl and Chromeless at the same time?

iphone - google::dense_hash_map 与 std::tr1::unordered_map 相比?

objective-c - 类型转换类类型

c++ - 一个数组来保存 C++ 中的任何对象?