如何在结构上使用 std::unique_ptr?

Posted

技术标签:

【中文标题】如何在结构上使用 std::unique_ptr?【英文标题】:How to use std::unique_ptr on a struct? 【发布时间】:2019-08-02 02:11:47 【问题描述】:

标题说明了大部分内容,我该怎么做?我用谷歌搜索了一下,没有人告诉我它不能完成,但也没有人解释如何去做。

在此处获取这段代码:

#include <cstdio>
#include <memory>

int main(void)

    struct a_struct
    
        char first;
        int second;
        float third;
    ;

    std::unique_ptr<a_struct> my_ptr(new a_struct);

    my_ptr.first = "A";
    my_ptr.second = 2;
    my_ptr.third = 3.00;

    printf("%c\n%i\n%f\n",my_ptr.first, my_ptr.second, my_ptr.third);

    return(0);

正如可以回答这个问题的人已经知道的那样,这是行不通的,甚至无法编译。

我的问题是我该如何做这样的事情?

编译错误(使用g++-7)看起来像

baduniqueptr6.cpp: In function ‘int main()’:
baduniqueptr6.cpp:15:12: error: ‘class std::unique_ptr<main()::a_struct>’ has no member named ‘first’
     my_ptr.first = "A";
            ^~~~~
baduniqueptr6.cpp:16:12: error: ‘class std::unique_ptr<main()::a_struct>’ has no member named ‘second’
     my_ptr.second = 2;
            ^~~~~~
baduniqueptr6.cpp:17:12: error: ‘class std::unique_ptr<main()::a_struct>’ has no member named ‘third’
     my_ptr.third = 3.00;
            ^~~~~
baduniqueptr6.cpp:19:34: error: ‘class std::unique_ptr<main()::a_struct>’ has no member named ‘first’
     printf("%c\n%i\n%f\n",my_ptr.first, my_ptr.second, my_ptr.third);
                                  ^~~~~
baduniqueptr6.cpp:19:48: error: ‘class std::unique_ptr<main()::a_struct>’ has no member named ‘second’
     printf("%c\n%i\n%f\n",my_ptr.first, my_ptr.second, my_ptr.third);
                                                ^~~~~~
baduniqueptr6.cpp:19:63: error: ‘class std::unique_ptr<main()::a_struct>’ has no member named ‘third’
     printf("%c\n%i\n%f\n",my_ptr.first, my_ptr.second, my_ptr.third);
                                                               ^~~~~

【问题讨论】:

无关:if std::make_unique is available to you 你应该养成使用它的习惯。它消除了构造函数和new 无法保护您免受的一些错误情况。 问题是std::unique_ptr 本身也是一个struct,因此在这种类型的实例上使用. 您试图访问std::unique_ptr 的成员而不是它指向的结构。例如你可以调用方法get() - en.cppreference.com/w/cpp/memory/unique_ptr/get auto rawpointer = my_ptr.get(); 【参考方案1】:

您应该使用-&gt; 而不是.std::unique_ptr 是smart pointer,其行为类似于原始指针。

my_ptr->first = 'A';
my_ptr->second = 2;
my_ptr->third = 3.00;

printf("%c\n%i\n%f\n",my_ptr->first, my_ptr->second, my_ptr->third);

LIVE

或者你可以使用operator*对指针进行解引用,然后你可以使用operator.,这也和原始指针一样。

(*my_ptr).first = 'A';
(*my_ptr).second = 2;
(*my_ptr).third = 3.00;

printf("%c\n%i\n%f\n",(*my_ptr).first, (*my_ptr).second, (*my_ptr).third);

LIVE

PS:你应该把"A"(这是一个c风格的字符串)改成'A'(这是一个char)。

【讨论】:

谢谢,解决了。 g++ 没有给我太多关于这个问题的信息。 @Mutaru 好吧,clang 给出了相同的信息,但它给出了更多提示,您是不是要使用 '->' 而不是 '.'? 更好的是,用auto my_ptr = std::make_unique&lt;a_struct&gt;();初始化智能指针。

以上是关于如何在结构上使用 std::unique_ptr?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中使用 std::unique_ptr?

如何在构造函数中使用删除器初始化 std::unique_ptr?

如何将 std::sort() 与 std::unique_ptr<[]> 一起使用?

如何将 std::unique_ptr 初始化为引用

调整 std::vector<std::unique_ptr<T>> 大小的性能

带有数组的 unique_ptr 有啥用吗?