gpt4 book ai didi

c++ - 从函数返回具有常量成员的对象的方法

转载 作者:行者123 更新时间:2023-11-28 03:46:46 27 4
gpt4 key购买 nike

假设您有一个成员变量声明为常量的类。

class Test
{
public:
Test(const int const_param) : const_member_(const_param) {}

private:
const int const_member_;
};

我们想要一个函数,该函数将返回此对象的实例作为“返回值”

Test Foo();  
Test* Foo();
Test& Foo();

或作为“输出参数”(即传入的指针)。

void Foo(Test* test);
void Foo(Test** test); // maybe this is more correct?

请注意,此函数是唯一可以创建对象的函数(在上面的示例中,Foo 将是唯一知道 const_param 值的函数,因此可以创建一个 Test 对象)

做这样的事情最好的方法是什么?这可能吗?

最佳答案

你可以只通过拷贝返回这样的对象,除非你有充分的理由避免这种设计:

Foo make_foo()
{
int n = get_mystery_value()
Foo x(n);
x.manipulate();
return x;
}

如果您更愿意通过指针处理对象,请使用 std::shared_ptr<Foo>相反:

std::shared_ptr<Foo> make_foo()
{
int n = roll_dice();
auto px = std::make_shared<Foo>(n);
px->crazy_stuff();
return px;
};

或者,如果您只需要一个处理程序对象,请使用 std::unique_ptr<Foo> .


一点解释:在你的对象中有一个常量成员本质上意味着对象本身具有常量对象的语义。可以复制常量,但不能重新分配它们,因此在您的典型用例中,您只会创建一次此类的对象,而不会重新分配它。自动为您定义了一个复制构造函数,因此您可以直接说:

int main()
{
Foo x = make_foo();
Foo y(make_foo()); // same thing

x.twiddle();
y.skedaddle();

// ...
}

显然你不能也不会说 x = make_foo(); ,因为你的 x在语义上是一个常量,重新分配没有意义。

关于c++ - 从函数返回具有常量成员的对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7355239/

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