通过初始化创建一个指向新结构的共享指针

J B*_*ble 4 c++ struct

在 Mac 上的 Xcode 中使用 libc++(GNU++11 方言)、LLVM 编译器。

我有一个结构如下:

struct Vertex
{
    float position[3];
    float colour[4];
    float normal[3];
};
Run Code Online (Sandbox Code Playgroud)

目前我正在堆上创建一个实例,如下所示:

Vertex *vertex = new Vertex({{0.1f, 0.1f, 0.1f},
                            {0.0f, 0.0f, 0.0f, 0.0f},
                            {1.0f, 0.0f, 0.0f}} );
Run Code Online (Sandbox Code Playgroud)

不过我想创建一个共享指针。下面的代码是最好的方法吗?

Vertex v = Vertex( {{0.1f, 0.1f, 0.1f},
                    {0.0f, 0.0f, 0.0f, 0.0f},
                    {1.0f, 0.0f, 0.0f}} );

std::shared_ptr<Vertex> vertex = std::make_shared<Vertex>(v);
Run Code Online (Sandbox Code Playgroud)

或者我应该在创建共享指针之前创建Vertexusing ?new

更新

我尝试过以下方法:

auto vertex = std::make_shared<PCNVertex>( {{0.1f, 0.1f, 0.1f},
                                            {0.0f, 0.0f, 0.0f, 0.0f},
                                            {1.0f, 0.0f, 0.0f}} );
Run Code Online (Sandbox Code Playgroud)

按照建议,但我收到错误no matching function for call to 'make_shared'

fel*_*lix 5

在第一个代码片段(更新之前的代码片段)中,std::make_shared将为新的代码片段分配内存Vector并使用给定的参数构造它v,在本例中为复制构造。它会工作得很好。

第二个代码片段(在您的更新中)不起作用,因为编译器无法推导出与参数匹配的正确类型。函数模板 std::make_shared 声明为:

template< class T, class... Args >
shared_ptr<T> make_shared( Args&&... args );
Run Code Online (Sandbox Code Playgroud)

这个问题可以通过“转换”来解决。

auto vertex = std::make_shared<Vertex>(
      Vertex{{0.1f, 0.1f, 0.1f},
             {0.0f, 0.0f, 0.0f, 0.0f},
             {1.0f, 0.0f, 0.0f}} );   
Run Code Online (Sandbox Code Playgroud)