gpt4 book ai didi

c++ - C++中的虚拟 move 构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 15:00:35 25 4
gpt4 key购买 nike

只是面临一种情况,不知道该怎么办...这是我现在的代码:

class IMyDbAccessor {
public:
int getSum(); // quite important for my case that it is not const.
// it does some caching. Of course I may use mutable,
// but actually it is not that important here.
};

void SomeBusinessLogic(IMyDbAccessor& dbacc) { /* implementation */ }

int main(int argc, char** argv) {
MyDbAccessor acc(argv);
SomeBusinessLogic(acc);
}

不喜欢,因为表达力不够。我想拥有

void SomeBusinessLogic(IMyDbAccessor&& dbacc) { /* implementation */ }

为了表明 SomeBusinessLogic 想要拥有一个传递的对象,所以 main 应该看起来像

int main(int argc, char** argv) {
MyDbAccessor acc(argv);
SomeBusinessLogic(std::move(acc));
}

但这当然是不可能的……有谁知道这样做的原因是什么?对我来说,这非常有意义。

或者我的感觉是错误的,我不应该让 SomeBusinessLogic 负责 IMyDbAccessor 所有权,所以最好将它作为 const IMyDbAccessor& 传递?

最佳答案

I don't like it, because it is not expressive enough.

对我来说看起来很有表现力。通过引用传递对象意味着该函数可以对调用者提供的现有对象进行操作,而不是对拷贝进行操作。不用担心管理所有权。

I would like to have

void SomeBusinessLogic(IMyDbAccessor&& dbacc) { /* implementation */ }

to show that SomeBusinessLogic wants to own a passed object

这不是右值引用所代表的。右值引用意味着 dbacc 将引用编译器在实际调用站点创建的临时 对象,或者调用者使用 传递的预先存在的对象>std::move()。无论哪种方式,dbacc 引用的对象在 SomeBusinessLogic() 退出后预计不会再被使用,因此允许 SomeBuinessLogic() “窃取”dbacc 引用的对象持有的任何内部数据 的所有权,而不是复制它。这与对象本身的所有权无关。这仍然完全取决于调用者。

so main should look like

int main(int argc, char** argv) {
MyDbAccessor acc(argv);
SomeBusinessLogic(std::move(acc));
}

But of course it is impossible...

你要找的是std::unique_ptr:

void SomeBusinessLogic(std:::unique_ptr<IMyDbAccessor> dbacc) { /* implementation */ }

int main(int argc, char** argv) {
std::unique_ptr<IMyDbAccessor> acc(new MyDbAccessor(argv));
SomeBusinessLogic(std::move(acc));
}

或者:

int main(int argc, char** argv) {
SomeBusinessLogic(std::make_unique<MyDbAccessor>(argv));
}

一次只能有一个 std::unique_ptr 保存给定的指针,因为 std::unique_ptr 会在销毁时释放所指向的内存。这就是它“独一无二”的原因。当您看到 std::unique_ptr 时,您知道所有者是谁。将 std::unique_ptr 对象按值传递给函数意味着它仅在函数的生命周期内存在。

因此,这种方法非常清楚地表明 dbacc 本身,而不是调用者,拥有 IMyDbAccessor 对象的独占所有权,并将当 SomeBusinessLogic() 退出时释放该对象(除非 SomeBusinessLogic() 决定 std::move() dbaccSomeBusinessLogic() 之外的另一个 std::unique_ptr

Or my feelings are wrong and I should not make SomeBusinessLogic responsible for IMyDbAccessor ownership, so it's better to pass it as a const IMyDbAccessor&?

我愿意,是的。除非有一些令人信服的理由 SomeBusinessLogic() 必须从调用者手中夺走所有权。

关于c++ - C++中的虚拟 move 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47232340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com