【问题标题】:Trouble with operator "=" when assigning a unique_ptr<>分配 unique_ptr<> 时运算符“=”出现问题
【发布时间】:2021-04-16 19:51:32
【问题描述】:

在这段代码中,PaymentCredit 的抽象基类。知道如何解决这个任务吗?

二进制“=”:未找到采用“Credit *”类型右侧操作数的运算符(或没有可接受的转换)

unique_ptr<Payment> p;
Credit c("<cardnumber>", "<expdate>", 9999.99);
p = &c;

【问题讨论】:

  • 你很幸运。如果成功,程序将删除c 两次。
  • 好问题,从智能指针开始很容易犯错误。当您声明一个局部变量时,您可以将其视为函数“拥有”该变量。所以如果你想让unique_ptr拥有它,你需要在指针内部构造它。
  • @TedLyngmo — 程序会删除对象一次并销毁它两次。
  • @PeteBecker 是的,我同意。我的措辞草率。

标签: c++ object abstract-class unique-ptr


【解决方案1】:

你应该在这里使用std::make_unique

std::unique_ptr<Payment> p = std::make_unique<Credit>("<cardnumber>", "<expdate>", 9999.99);

请记住,unique_ptr 拥有您给它的指针的所有权。在您的代码中,您将 c 分配为局部变量,因此将指向该变量的原始指针提供给 unique_ptr 将导致该变量为 deleted,这是非法的。

【讨论】:

  • 太棒了!感谢您及时的回复。有道理哈哈。
【解决方案2】:

您需要使用new 运算符分配Credit 对象,以便unique_ptr 稍后可以delete 它。您将 c 声明为局部变量,而不是通过 new。因此,即使代码可以编译,它在运行时也不会表现正确。

std::unique_ptr 没有将 原始指针 作为输入的 operator=,只有另一个 unique_ptr。这就是您收到编译器错误的原因。

如果你只有一个可用的原始指针,你可以使用unique_ptr::reset() 方法,例如:

unique_ptr<Payment> p;
...
Credit *c = new Credit("<cardnumber>", "<expdate>", 9999.99);
p.reset(c);

但最好不要使用原始指针,它应该从一开始就包裹在unique_ptr中,例如:

unique_ptr<Payment> p(new Credit("<cardnumber>", "<expdate>", 9999.99));

或者:

unique_ptr<Payment> p = std::make_unique<Credit>("<cardnumber>", "<expdate>", 9999.99);

如果你想单独声明和分配p,你也可以这样做,例如:

unique_ptr<Payment> p;
...
p = std::unique_ptr<Payment>(new Credit("<cardnumber>", "<expdate>", 9999.99));

或者:

unique_ptr<Payment> p;
...
p = std::make_unique<Credit>("<cardnumber>", "<expdate>", 9999.99);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    相关资源
    最近更新 更多